Znalazłem jeszcze jedno rozwiązanie, które pozwala nie kodować na stałe fragmentu definicji kolumny MySQL w twoim @Column
adnotacja. Zdefiniuj własny dialekt hibernacji, zastępując 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)" );
}
}
i określ go jako właściwość hibernate hibernate.dialect=org.yourproject.MySQL564PlusDialect
(dialekt, który chcesz rozszerzyć, może się różnić, np. org.hibernate.dialect.MySQL5InnoDBDialect
zamiast tego).
Teraz możesz dostosować precyzję swojej DATETIME
z wnętrza @Column
adnotacja za pomocą length
atrybut:
@Basic(optional=false)
@Column(name="moment", length=3)
@Type(type="org.jadira.usertype.dateandtime.joda.PersistentDateTime")
public DateTime getMoment() {
...
co wygeneruje DATETIME(3)
definicja kolumny oznaczająca milisekundową precyzję. Jeśli potrzebujesz prostego DATETIME
(bez ułamków sekund), po prostu nie określaj długości. Możesz użyć wartości length
do 6, co oznaczałoby precyzję w mikrosekundach.
Jeśli zdarzy ci się użyć innego dialektu niż powyższy (na przykład standardowego org.hibernate.dialect.MySQLDialect
a może jakaś inna baza danych), która nie złamie Twojego kodu:length
atrybut w @Column
zostaną zignorowane.
PS Rozsądniej byłoby wykorzystać precision
atrybut @Column
zamiast length
, ale proste zastąpienie "datetime($l)"
wzorzec z "datetime($p)"
jeden w mojej własnej implementacji dialektu nie działa od razu.