#java #jpa #version #embeddable
#java #jpa #версия #встраиваемый
Вопрос:
когда я использую аннотацию JPA @Version в классе @Embeddable, я получаю следующее исключение, указывающее на мой Updateable
класс:
org.hibernate.AnnotationException: Unable to define @Version on an embedded class
Вот мой код:
@Embeddable
public class Updateable {
@Version
private long modcount;
private String updatedBy;
private DateTime updatedAt;
// getters amp; setters
}
@Entity
public class SomeEntity {
@Id
private Long id;
@Embedded
private Updateable updateAudit;
// other stuff
}
Невозможно ли иметь @Version в классе @Embeddable, или это специфично для гибернации?
Ответ №1:
Встраиваемый класс — это просто удобный способ объявления повторно используемых элементов объекта, т. Е. ваш Updateable
можно использовать в других объектах без необходимости повторного добавления полей и сопоставления.
Таким образом, встраиваемые объекты являются частью объекта (как следует из названия, они встроены), и, следовательно, независимое управление версиями не имеет смысла.
Добавление @Version
аннотации только к встраиваемому также не имело бы особого смысла, поскольку само встраиваемое не может быть версионным, и вам пришлось бы иметь дело со случаями, когда несколько встраиваемых объектов содержатся в одном объекте (например, какую версию следует использовать в этом случае?). Итак, поскольку @Version
имеет смысл только для объектов, проще просто разрешить эту аннотацию для объектов или сопоставленных суперклассов.
На самом деле, хотя спецификация JPA рекомендует, чтобы свойства версии были числовыми, строковыми или временными метками, похоже, что Hibernate предоставляет пользовательские типы версий:
Столбец version может быть числовым (рекомендуемое решение) или временной меткой. Режим гибернации поддерживает любой тип при условии, что вы определяете и реализуете соответствующий UserVersionType.
Итак, что вы могли бы сделать (не тестировалось, просто получено из документов), если вы хотите использовать Updateable
в качестве своей версии, — это предоставить пользовательский тип пользователя для Updateable
, а затем использовать его следующим образом:
@Entity
public class SomeEntity {
@Id
private Long id;
@Type( "your.custom.UserVersionType" )
@Version
private Updateable updateAudit;
// other stuff
}
Комментарии:
1. Спасибо! Это было не то, на что я надеялся, но, увы, все это имеет смысл, когда вы думаете об этом в терминах сущностей.