Org.hibernate.nnotes против javax.persistence
Неплохо ли использовать аннотации из
пакет javax.persistence
вместо использования
org.hibernate.annotations аннотации
Я знаю, что использование javax.peristence
действительно вводит еще одну зависимость. Но если я проигнорирую это, каковы плюсы и минусы?
Ответы
Ответ 1
Довольно oppsite.
Hibernate - это реализация Java Persistence API, и там, где это возможно, вы должны использовать стандартные аннотации (в javax.persistence). Таким образом, вы можете теоретически запустить свой код в других реализациях JPA.
Только если вам нужна функциональность Hibernate, если вы используете аннотации Hibernate.
Дополнительная зависимость зависит только от файлов jar интерфейса/аннотации jar и очень легкой.
Ответ 2
Другие минусы в:
http://www.mkyong.com/hibernate/cascade-jpa-hibernate-annotation-common-mistake/
где:
@OneToMany(fetch = FetchType.LAZY,
cascade = {CascadeType.PERSIST,CascadeType.MERGE },
mappedBy = "stock")
public Set<StockDailyRecord> getStockDailyRecords() {
return this.stockDailyRecords;
}
и это не работает:
stockDailyRecords.setStock(stock);
stock.getStockDailyRecords().add(stockDailyRecords);
session.save(stock);
session.getTransaction().commit();
как @OneToMany из JPA, он ожидал каскада JPA - javax.persistence.CascadeType. Однако, когда вы сохраняете его с сеансом Hibernate, org.hibernate.engine.Cascade выполнит следующую проверку...
if ( style.doCascade( action ) ) {
и Hibernate save приведет к действию ACTION_SAVE_UPDATE, но JPA передаст ACTION_PERSIST и ACTION_MERGE, он не будет соответствовать и не сможет выполнить каскад.
Ответ 3
Я использовал аннотацию javax.persistence
, и когда я заменил Tomcat 6.0 моей Glass Fish, Tomcat 6.0 включил еще один пакет javax.persistence, который все испортил. Я не считаю целесообразным использовать аннотацию javax.persistence
. Бог знает, что, черт возьми, случилось с Томкатом и javax.persistence
!
Ответ 4
Официально рекомендуется смешивать аннотации JPA и Hibernate в случае установки каскадных параметров, см.
Hibernate docs. 2.4.7. Каскад. Если вы используете только аннотации JPA, в случае однонаправленного сопоставления (без поля типа Foo в Employer.java) вы все равно получаете "не удается сохранить временный объект Employer" в сеансе вызова. SaveOrUpdate. Cure использует hibernate-style @Cascade вместе с cascade = {...}:
class Foo {
@OneToMany( cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
@Cascade(org.hibernate.annotations.CascadeType.REPLICATE)
public Collection<Employer> getEmployers()
...
}