sql >> Databáze >  >> RDS >> Mysql

Přesnost MySQL DATETIME (joda-time, Hibernate, org.jadira.usertype, hbm2ddl)

Našel jsem ještě jedno řešení, které umožňuje nekódovat napevno fragment definice sloupce MySQL ve vašem @Column anotace. Definujte svůj vlastní hibernační dialekt přepsáním 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)" );
   }
}

a zadejte ji jako vlastnost hibernace hibernate.dialect=org.yourproject.MySQL564PlusDialect (dialekt, který chcete rozšířit, se může lišit, např. org.hibernate.dialect.MySQL5InnoDBDialect místo).

Nyní můžete upravit přesnost DATETIME v rámci @Column anotace pomocí length atribut:

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

což vytvoří DATETIME(3) definice sloupce znamená přesnost na milisekundy. Pokud potřebujete jednoduchý DATETIME (žádné zlomky sekund), jen neuvádějte délku. Můžete použít hodnotu length až 6, což by znamenalo přesnost v mikrosekundách.

Pokud náhodou používáte dialekt odlišný od výše uvedeného (například standardní org.hibernate.dialect.MySQLDialect nebo možná nějaká jiná databáze), která nenaruší váš kód:length atribut na @Column bude ignorováno.

P.S. Bylo by rozumnější využít precision atribut @Column místo length , ale jednoduché nahrazení "datetime($l)" vzor s "datetime($p)" jeden v mé vlastní dialektové implementaci nefunguje z ruky.



  1. mysql, transponovat/pivotovat řádek do sloupce, výběr proměnných

  2. Jak najít nastavení ANSI_NULLS databáze v SQL Server (T-SQL)

  3. Jak získat poslední vložené ID?

  4. PHP/MySQL:Nejlepší postupy pro peněžní operace/ukládání?