Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL DATETIME-Präzision (joda-time, Hibernate, org.jadira.usertype, hbm2ddl)

Ich habe eine weitere Lösung gefunden, die es ermöglicht, das MySQL-Spaltendefinitions-Snippet in Ihrem @Column nicht fest zu codieren Anmerkung. Definieren Sie Ihren eigenen Hibernate-Dialekt, indem Sie org.hibernate.dialect.MySQLDialect überschreiben :

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)" );
   }
}

und geben Sie es als Hibernate-Eigenschaft hibernate.dialect=org.yourproject.MySQL564PlusDialect an (Der Dialekt, den Sie erweitern möchten, kann variieren, z. B. org.hibernate.dialect.MySQL5InnoDBDialect stattdessen).

Jetzt können Sie die Genauigkeit Ihres DATETIME anpassen aus @Column Anmerkung mit length Attribut:

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

was DATETIME(3) erzeugt Spaltendefinition bedeutet Millisekunden-Präzision. Wenn Sie das einfache DATETIME benötigen (keine Sekundenbruchteile), nur keine Länge angeben. Sie können den Wert length verwenden bis zu 6, was eine Genauigkeit von Mikrosekunden bedeuten würde.

Wenn Sie zufällig einen anderen Dialekt als den obigen verwenden (zum Beispiel den Standard org.hibernate.dialect.MySQLDialect oder vielleicht eine andere Datenbank), die Ihren Code nicht brechen wird:die length Attribut auf @Column wird ignoriert.

P.S. Sinnvoller wäre es, die precision auszunutzen Attribut von @Column statt length , aber einfaches Ersetzen von "datetime($l)" Muster mit "datetime($p)" Eine Implementierung in meinem eigenen Dialekt funktioniert nicht ohne Weiteres.