Jag har hittat ytterligare en lösning som gör det möjligt att inte hårdkoda MySQL-kolumndefinitionskod i din @Column
anteckning. Definiera din egen vilolägesdialekt genom att åsidosätta 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)" );
}
}
och ange den som hibernate-egenskap hibernate.dialect=org.yourproject.MySQL564PlusDialect
(dialekten du vill utöka kan variera, t.ex. org.hibernate.dialect.MySQL5InnoDBDialect
istället).
Nu kan du justera precisionen för din DATETIME
inifrån @Column
anteckning genom att använda length
attribut:
@Basic(optional=false)
@Column(name="moment", length=3)
@Type(type="org.jadira.usertype.dateandtime.joda.PersistentDateTime")
public DateTime getMoment() {
...
som kommer att producera DATETIME(3)
kolumndefinition betyder millisekunders precision. Om du behöver den enkla DATETIME
(inga bråkdelar av sekunder), ange bara inte längden. Du kan använda värdet length
upp till 6 vilket skulle innebära mikrosekunders precision.
Om du råkar använda en annan dialekt än den ovan (till exempel standarden org.hibernate.dialect.MySQLDialect
eller kanske någon annan databas), som inte bryter din kod:length
attribut på @Column
kommer att ignoreras.
P.S. Det skulle vara mer förnuftigt att utnyttja precision
attribut för @Column
istället för length
, men enkel ersättning av "datetime($l)"
mönster med "datetime($p)"
en i min egen dialektimplementering fungerar inte direkt.