org.hibernate.annotations与javax.persistence

使用注释是不好的主意

javax.persistence包

而不是使用

org.hibernate.annotations注释

我知道使用javax.peristence确实引入了另一个依赖项。 但是如果我忽略这个,有什么优点/缺点?

相当相反。

Hibernate是Java Persistence API的一个实现,在可能的情况下,您应该使用标准注释(在javax.persistence中)。 这样,您理论上可以在其他JPA实现上运行您的代码。

只有当你需要Hibernate特定的function时才能使用Hibernate注释。

额外的依赖只是在JPA接口/注释jar文件,非常轻。

另一个缺点:

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,不会匹配导致级联失败执行。

我使用了javax.persistence注释,当我用Glass Fishreplace了Tomcat 6.0时,Tomcat 6.0包含了另一个javax.persistence包,它把所有东西搞砸了。 我不认为这是一个好主意,使用javax.persistence注释。 天知道Tomcat和javax.persistence发生了什么事情!

在设置级联选项的情况下,正式推荐混合使用JPA和Hibernate注释,请参阅Hibernate文档。 2.4.7。 级联 。 如果仅使用JPA批注,如果是单向映射(Employer.java中没有Footypes的字段),则在调用session.SaveOrUpdate时仍然会收到“无法保存临时对象雇主”的声明。 治愈是使用hibernate风格@Cascade与级联= {…}:

 class Foo { @OneToMany( cascade = {CascadeType.PERSIST, CascadeType.MERGE} ) @Cascade(org.hibernate.annotations.CascadeType.REPLICATE) public Collection<Employer> getEmployers() ... }