Mysql
 sql >> Database >  >> RDS >> Mysql

Precisione MySQL DATETIME (joda-time, Hibernate, org.jadira.usertype, hbm2ddl)

Ho trovato un'altra soluzione che consente di non codificare lo snippet di definizione della colonna MySQL nel tuo @Column annotazione. Definisci il tuo dialetto di ibernazione sovrascrivendo 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)" );
   }
}

e specificalo come proprietà di ibernazione hibernate.dialect=org.yourproject.MySQL564PlusDialect (il dialetto che vorrai estendere può variare, ad esempio org.hibernate.dialect.MySQL5InnoDBDialect invece).

Ora puoi regolare la precisione del tuo DATETIME da @Column annotazione utilizzando length attributo:

@Basic(optional=false)
@Column(name="moment", length=3)
@Type(type="org.jadira.usertype.dateandtime.joda.PersistentDateTime")
public DateTime getMoment() {
 ...

che produrrà DATETIME(3) definizione di colonna che significa precisione in millisecondi. Se hai bisogno del semplice DATETIME (nessuna frazione di secondo), semplicemente non specificare la lunghezza. Puoi usare il valore di length fino a 6 che significherebbe una precisione di microsecondi.

Se ti capita di usare un dialetto diverso da quello sopra (ad esempio lo standard org.hibernate.dialect.MySQLDialect o forse qualche altro database), che non interromperà il tuo codice:la length attributo su @Column verrà ignorato.

PS Sarebbe più sensato sfruttare la precision attributo di @Column invece di length , ma semplice sostituzione di "datetime($l)" modello con "datetime($p)" uno nel mio dialetto l'implementazione non funziona in modo immediato.