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.