org.hibernate.annotations与javax.persistence

java hibernate jpa

17929 观看

4回复

0 作者的声誉

使用来自的注释是不是一个坏主意

javax.persistence包

而不是使用

org.hibernate.annotations注释

我知道使用javax.peristence确实引入了另一种依赖。但如果我忽视这一点,那么利弊是什么?

作者: anon 的来源 发布者: 2009 年 3 月 31 日

回应 (4)


65

196075 作者的声誉

决定

相当于对手。

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

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

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

作者: Thilo 发布者: 31.03.2009 08:31

1

75 作者的声誉

我使用了javax.persistence注释,当我用我的Glass Fish替换Tomcat 6.0时,Tomcat 6.0包含了另一个javax.persistence包,它搞砸了所有东西。我不认为使用javax.persistence注释是个好主意。上帝知道Tomcat到底发生了什么事javax.persistence

作者: Mr Cold 发布者: 14.12.2009 09:10

5

23192 作者的声誉

另一个缺点是:

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();

不会像@OneToManyJPA 那样工作,它期望一个JPA级联 - javax.persistence.CascadeType。但是,当您使用Hibernate会话保存它时,org.hibernate.engine.Cascade将执行以下检查:

if ( style.doCascade( action ) ) {

和Hibernate保存过程中会造成ACTION_SAVE_UPDATE动作,但是JPA将传递一个ACTION_PERSISTACTION_MERGE,这将不匹配,导致级联无法执行。

作者: gavenkoa 发布者: 17.07.2013 03:57

0

536 作者的声誉

在设置级联选项的情况下,官方建议混合使用JPA和Hibernate注释,请参阅 Hibernate文档。2.4.7。级联。如果您只使用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()
...
}
作者: Lord 发布者: 06.09.2013 12:16
32x32