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.