【发布时间】:2010-10-16 13:54:14
【问题描述】:
使用来自
的注释是不是一个坏主意javax.persistence 包
而不是使用
org.hibernate.annotations 注释
我知道使用javax.peristence 确实会引入另一个依赖项。但如果我忽略这一点,有什么优点/缺点?
【问题讨论】:
使用来自
的注释是不是一个坏主意javax.persistence 包
而不是使用
org.hibernate.annotations 注释
我知道使用javax.peristence 确实会引入另一个依赖项。但如果我忽略这一点,有什么优点/缺点?
【问题讨论】:
恰恰相反。
Hibernate 是 Java Persistence API 的一种实现,在可能的情况下,您应该使用标准注解(在 javax.persistence 中)。这样,理论上您可以在其他 JPA 实现上运行您的代码。
只有当您需要特定于 Hibernate 的功能时,您才应该使用 Hibernate 注释。
额外的依赖只在JPA接口/注解jar文件上,非常轻。
【讨论】:
我使用了javax.persistence 注释,当我用我的 Glass Fish 替换 Tomcat 6.0 时,Tomcat 6.0 包含了另一个 javax.persistence 包,它搞砸了一切。我认为使用javax.persistence 注释不是一个好主意。天知道 Tomcat 和 javax.persistence 到底发生了什么!
【讨论】:
另一个缺点:
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,它不会匹配并导致级联无法执行。
【讨论】:
官方推荐在设置级联选项的情况下混合使用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()
...
}
【讨论】: