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() ... }
- 在模型类中使用javafx.beans属性
- hibernate:LazyInitializationException:无法初始化代理
- HIbernate commit()和flush()
- 如何从Hibernate Criteria API获取SQL(* not *用于日志logging)
- JPA OneToMany和ManyToOne关系
- 从Spring MVC发送JSON时dynamic忽略Java对象的字段
- 什么是hibernate加载?
- CreateProcess error = 206,运行main()方法时文件名或扩展名太长
- @ManyToOne(可选= false)和@Column(nullable = false)之间有什么区别?