sql >> Database teknologi >  >> RDS >> Mysql

MySQL DATETIME-præcision (joda-time, Hibernate, org.jadira.usertype, hbm2ddl)

Jeg har fundet en løsning mere, der gør det muligt ikke at hardkode MySQL-kolonnedefinitionskodestykket i din @Column anmærkning. Definer din egen dvaledialekt ved at tilsidesætte org.hibernate.dialect.MySQLDialect :

package org.yourproject;

import java.sql.Types;
import org.hibernate.dialect.MySQL5Dialect;

public class MySQL564PlusDialect extends MySQL5Dialect {
   public MySQL564PlusDialect() {
      super();
      registerColumnType( Types.TIMESTAMP, 6, "datetime($l)" );
   }
}

og angiv den som hibernate-egenskab hibernate.dialect=org.yourproject.MySQL564PlusDialect (den dialekt du ønsker at udvide kan variere, f.eks. org.hibernate.dialect.MySQL5InnoDBDialect i stedet).

Nu kan du justere præcisionen af ​​din DATETIME fra @Column annotering ved at bruge length attribut:

@Basic(optional=false)
@Column(name="moment", length=3)
@Type(type="org.jadira.usertype.dateandtime.joda.PersistentDateTime")
public DateTime getMoment() {
 ...

som vil producere DATETIME(3) kolonnedefinition betyder millisekunders præcision. Hvis du har brug for den simple DATETIME (ingen brøkdele sekunder), angiv bare ikke længden. Du kan bruge værdien length op til 6, hvilket ville betyde mikrosekunders præcision.

Hvis du tilfældigvis bruger en anden dialekt end ovenstående (for eksempel standarden org.hibernate.dialect.MySQLDialect eller måske en anden database), der ikke ødelægger din kode:length attribut på @Column vil blive ignoreret.

P.S. Det ville være mere fornuftigt at udnytte precision attribut for @Column i stedet for length , men simpel udskiftning af "datetime($l)" mønster med "datetime($p)" en i min egen dialektimplementering virker ikke direkte.



  1. Indstil nøgle/værdipar i sessionskonteksten i SQL Server (sp_set_session_context)

  2. Begræns en venstre joinforbindelse til at returnere ét resultat?

  3. Mysql-indekset bliver ignoreret

  4. Hvordan fungerer Stuff og 'For XML Path' i SQL Server?