sql >> Databasteknik >  >> RDS >> Mysql

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

Jag har hittat ytterligare en lösning som gör det möjligt att inte hårdkoda MySQL-kolumndefinitionskod i din @Column anteckning. Definiera din egen vilolägesdialekt genom att åsidosätta 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)" );
   }
}

och ange den som hibernate-egenskap hibernate.dialect=org.yourproject.MySQL564PlusDialect (dialekten du vill utöka kan variera, t.ex. org.hibernate.dialect.MySQL5InnoDBDialect istället).

Nu kan du justera precisionen för din DATETIME inifrån @Column anteckning genom att använda length attribut:

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

som kommer att producera DATETIME(3) kolumndefinition betyder millisekunders precision. Om du behöver den enkla DATETIME (inga bråkdelar av sekunder), ange bara inte längden. Du kan använda värdet length upp till 6 vilket skulle innebära mikrosekunders precision.

Om du råkar använda en annan dialekt än den ovan (till exempel standarden org.hibernate.dialect.MySQLDialect eller kanske någon annan databas), som inte bryter din kod:length attribut på @Column kommer att ignoreras.

P.S. Det skulle vara mer förnuftigt att utnyttja precision attribut för @Column istället för length , men enkel ersättning av "datetime($l)" mönster med "datetime($p)" en i min egen dialektimplementering fungerar inte direkt.



  1. oracle SQL hur man tar bort tid från datum

  2. Några idéer om resurspooling på låg nivå i PostgreSQL

  3. android SQLite-databas med databas på specifik plats möjligt?

  4. Okänd kolumn i fältlistan. PHP + Mysql