Našel jsem ještě jedno řešení, které umožňuje nekódovat napevno fragment definice sloupce MySQL ve vašem @Column
anotace. Definujte svůj vlastní hibernační dialekt přepsáním 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)" );
}
}
a zadejte ji jako vlastnost hibernace hibernate.dialect=org.yourproject.MySQL564PlusDialect
(dialekt, který chcete rozšířit, se může lišit, např. org.hibernate.dialect.MySQL5InnoDBDialect
místo).
Nyní můžete upravit přesnost DATETIME
v rámci @Column
anotace pomocí length
atribut:
@Basic(optional=false)
@Column(name="moment", length=3)
@Type(type="org.jadira.usertype.dateandtime.joda.PersistentDateTime")
public DateTime getMoment() {
...
což vytvoří DATETIME(3)
definice sloupce znamená přesnost na milisekundy. Pokud potřebujete jednoduchý DATETIME
(žádné zlomky sekund), jen neuvádějte délku. Můžete použít hodnotu length
až 6, což by znamenalo přesnost v mikrosekundách.
Pokud náhodou používáte dialekt odlišný od výše uvedeného (například standardní org.hibernate.dialect.MySQLDialect
nebo možná nějaká jiná databáze), která nenaruší váš kód:length
atribut na @Column
bude ignorováno.
P.S. Bylo by rozumnější využít precision
atribut @Column
místo length
, ale jednoduché nahrazení "datetime($l)"
vzor s "datetime($p)"
jeden v mé vlastní dialektové implementaci nefunguje z ruky.