【问题标题】:org.hibernate.annotations vs. javax.persistenceorg.hibernate.annotations 与 javax.persistence
【发布时间】:2010-10-16 13:54:14
【问题描述】:

使用来自

的注释是不是一个坏主意

javax.persistence 包

而不是使用

org.hibernate.annotations 注释

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

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

    恰恰相反。

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

    只有当您需要特定于 Hibernate 的功能时,您才应该使用 Hibernate 注释。

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

    【讨论】:

    • 因此可以将这些包(javax.persistence & org.hibernate.annotations)中的注释与@Entity 混合使用
    • 当您想使用休眠功能时,可以使用 jpa 实体。根据我的经验,您无法在所有实体中混合和匹配 jpa/hibernate。
    【解决方案2】:

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

    【讨论】:

    • 这个答案没有真正的帮助,因为它没有描述更改的条件、确切的症状,也没有可能的解决方案。哪些文件发生了变化,错误是什么,新的 jar 是什么?
    【解决方案3】:

    另一个缺点:

    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_PERSISTACTION_MERGE,它不会匹配并导致级联无法执行。

    【讨论】:

      【解决方案4】:

      官方推荐在设置级联选项的情况下混合使用JPA和Hibernate注解,见 Hibernate docs. 2.4.7. Cascade。如果您仅使用 JPA 注释,则在单向映射的情况下(在 Employer.java 中没有 Foo 类型的字段),您仍然会在调用 session.SaveOrUpdate 中获得“无法保存瞬态对象 Employer”。 Cure 使用休眠风格的@Cascade 和 cascade={...}:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-29
        • 1970-01-01
        • 1970-01-01
        • 2013-12-23
        • 2011-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多