繁体   English   中英

org.hibernate.annotations 与 javax.persistence

[英]org.hibernate.annotations vs. javax.persistence

使用来自

javax.persistence package

而不是使用

org.hibernate.annotations 注释

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

恰恰相反。

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

只有当您需要特定于 Hibernate 的功能时,您才应该使用 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 session 保存它时, org.hibernate.engine.Cascade将执行以下检查:

if ( style.doCascade( action ) ) {

和 Hibernate 保存过程将导致ACTION_SAVE_UPDATE动作,但 JPA 将传递ACTION_PERSISTACTION_MERGE ,它将不匹配并导致级联无法执行。

我使用了javax.persistence注释,当我用我的 Glass Fish 替换 Tomcat 6.0 时,Tomcat 6.0 包含另一个 javax.persistence ZEFE90A8E604A7C840E88D03AD87。 我认为使用javax.persistence注释不是一个好主意。 天知道 Tomcat 和javax.persistence到底发生了什么!

官方推荐在设置级联选项的情况下混合使用 JPA 和 Hibernate 注解,参见Hibernate 文档。 2.4.7。 级联 如果您只使用 JPA 注释,在单向映射的情况下(在 Employer.java 中没有 Foo 类型的字段),您仍然会在调用 Z21D6F40CFB5121982E4424ESaveOrUpdate.5082E4424ESaveOrUpdate.5082E4424A00 Cure 使用休眠风格的@Cascade 和 cascade={...}:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM