1

Calendarエンティティにフィールドがあります

@Column(nullable = false)
private Calendar transmissionDate;

ミリ秒の精度が必要です。そのままで、Hibernate はスキーマを生成し、このフィールドを

+-------------------+--------------+------+-----+---------+
| Field             | Type         | Null | Key | Default | 
+-------------------+--------------+------+-----+---------+
| transmission_date | datetime     | NO   |     | NULL    |
+-------------------+--------------+------+-----+---------+

MySQLで。MySQLdatetime型は 2 番目以降のすべてを破棄するため、精度が失われます。私が今のところ使用している解決策は

@Column(nullable = false)
private Long transmissionDate;

必要に応じて、それから Calendar インスタンスを生成します。

これは大きな問題であり、Hibernate にそれを克服できる機能があるかどうかを知りたいです。この質問は、カスタム型を使用する方法を示していますが、それを実装しても、Hibernate はまだdatetime列型にマッピングされています。

Calendarエンティティで型を使用しながら、ミリ秒の精度を維持するにはどうすればよいですか?

4

2 に答える 2

1

UserTypea を aにマップするカスタムを使用して動作するようCalendarにしましたBIGINT

public class CalendarType implements UserType {

    @Override
    public int[] sqlTypes() {
        return new int[] {Types.BIGINT};
    }

    @Override
    public Class<?> returnedClass() {
        return Calendar.class;
    }

    @Override
    public boolean equals(Object x, Object y) throws HibernateException {
        return x.equals(y);
    }

    @Override
    public int hashCode(Object x) throws HibernateException {
        return x.hashCode();
    }

    @Override
    public Object nullSafeGet(ResultSet resultSet, String[] names,SessionImplementor session, Object owner) throws HibernateException, SQLException {
        Long timeInMillis = resultSet.getLong(names[0]);
        if (timeInMillis == null) {
            return null;
        } else {
            Calendar calendar = Calendar.getInstance();
            calendar.setTimeInMillis(timeInMillis);
            return calendar;
        }       
    }

    @Override
    public void nullSafeSet(PreparedStatement preparedStatement, Object value, int index, SessionImplementor session) throws HibernateException, SQLException {
        Calendar calendar = (Calendar) value;
        preparedStatement.setLong(index, calendar.getTimeInMillis());       
    }

    @Override
    public Object deepCopy(Object value) throws HibernateException {
        return value;
    }

    @Override
    public boolean isMutable() {
        return false;
    }

    @Override
    public Serializable disassemble(Object value) throws HibernateException {
        Calendar calendar = (Calendar) value;       
        return calendar.getTimeInMillis();
    }

    @Override
    public Object assemble(Serializable cached, Object owner) throws HibernateException {
        Long timeInMillis = (Long) cached;

        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(timeInMillis);
        return calendar;
    }

    @Override
    public Object replace(Object original, Object target, Object owner) throws HibernateException {
        return original;
    }
}

そして、私のエンティティは

@TypeDef(name = "calendarType", typeClass = CalendarType.class)
@Entity
@Table
public class Entity {

    @Type(type = "calendarType")
    @Column(nullable = false)
    private Calendar transmissionDate;

    ...
}

Hibernate は魔法のようなものです。

于 2013-07-17T19:12:06.643 に答える
0

Joda DateTimeを使用します。クラスを使用してHibernateで直接マップでき、org.joda.time.contrib.hibernate.PersistentDateTimeミリ秒の精度があります。

@Column
@Type(type="org.joda.time.contrib.hibernate.PersistentDateTime")
private DateTime transmissionDate;
于 2013-07-17T15:56:38.313 に答える