Mysql
 sql >> Base de données >  >> RDS >> Mysql

Précision MySQL DATETIME (joda-time, Hibernate, org.jadira.usertype, hbm2ddl)

J'ai trouvé une autre solution qui permet de ne pas coder en dur l'extrait de définition de colonne MySQL dans votre @Column annotation. Définissez votre propre dialecte hibernate en remplaçant 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)" );
   }
}

et spécifiez-le comme propriété hibernate hibernate.dialect=org.yourproject.MySQL564PlusDialect (le dialecte que vous souhaitez étendre peut varier, par exemple org.hibernate.dialect.MySQL5InnoDBDialect à la place).

Vous pouvez maintenant ajuster la précision de votre DATETIME depuis @Column annotation en utilisant length attribut :

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

qui produira DATETIME(3) définition de colonne signifiant précision en millisecondes. Si vous avez besoin du simple DATETIME (pas de fraction de seconde), mais ne spécifiez pas la longueur. Vous pouvez utiliser la valeur de length jusqu'à 6, ce qui signifierait une précision de l'ordre de la microseconde.

S'il vous arrive d'utiliser un dialecte différent de celui ci-dessus (par exemple le standard org.hibernate.dialect.MySQLDialect ou peut-être une autre base de données), qui ne cassera pas votre code :la length attribut sur @Column sera ignoré.

PS Il serait plus judicieux d'exploiter la precision attribut de @Column au lieu de length , mais simple remplacement de "datetime($l)" modèle avec "datetime($p)" une dans ma propre implémentation de dialecte ne fonctionne pas spontanément.