使用
中的注释是一个坏主意javax.persistence包
而不是使用
org.hibernate.annotations annotations
我知道使用javax.peristence
会引入另一个依赖项。但是,如果我忽略它,有什么优点/缺点?
答案 0 :(得分:69)
相当反对。
Hibernate是Java Persistence API的一个实现,在可能的情况下,您应该使用标准注释(在javax.persistence中)。这样,理论上您可以在其他JPA实现上运行代码。
只有当您需要特定于Hibernate的功能时,才应使用Hibernate注释。
额外的依赖性仅在JPA接口/注释jar文件上,非常轻。
答案 1 :(得分:6)
另一个缺点:
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保存过程将导致ACTION_SAVE_UPDATE
操作,但JPA将传递ACTION_PERSIST
和ACTION_MERGE
,它将不匹配并导致级联无法执行。
答案 2 :(得分:2)
我使用了javax.persistence
注释,当我用我的Glass Fish替换Tomcat 6.0时,Tomcat 6.0包含了另一个javax.persistence包,它搞砸了所有东西。我不认为使用javax.persistence
注释是个好主意。上帝知道Tomcat和javax.persistence
到底发生了什么事!
答案 3 :(得分:0)
正式建议在设置级联选项的情况下混合使用JPA和Hibernate注释,请参阅 Hibernate docs. 2.4.7. Cascade。如果您只使用JPA注释,在单向映射的情况下(Employer.java中没有Foo类型的字段),您仍然会在调用session.SaveOrUpdate中获得“无法保存瞬态对象Employer”。 Cure使用hibernate风格的@Cascade和cascade = {...}:
class Foo {
@OneToMany( cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
@Cascade(org.hibernate.annotations.CascadeType.REPLICATE)
public Collection<Employer> getEmployers()
...
}