@Entity
class X {
@Id
int id;
public static final class Converter implements AttributeConverter<Set<Integer>, byte[]> {
@Override
public byte[] convertToDatabaseColumn(Set<Integer> attribute) {
return new byte[2]; // just for demo
}
@Override
public Set<Integer> convertToEntityAttribute(byte[] dbData) {
return new HashSet<>();// just for demo
}
}
@Convert(converter = X.Converter.class)
Set<Integer> s = new HashSet<>();
}
Я использую @Convert
для преобразования Set<Integer>
в байты в столбце дБ.Однако я обнаружил, что грязная проверка не работает на этом:
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
X a = new X();
a.s.add(1);
session.save(a);
transaction.commit();
Transaction transaction1 = session.beginTransaction();
session.update(a); // a is unchanged, so this update should do nothing
transaction1.commit();
session.close();
После запуска этого кода convertToDatabaseColumn
вызывался много раз:
call
Hibernate: insert into X (s, id) values (?, ?)
call
Hibernate: update X set s=? where id=?
call
call
Hibernate: update X set s=? where id=?
call
call
Что случилось?Как я должен позволить hibernate делать грязную проверку на Set<Integer>
?