簡體   English   中英

JPA在ManyToOne關系中持久化對象

[英]JPA persist object in a ManyToOne relationship

我的數據庫中有一個公司/員工@OneToMany關系定義為:

@Entity
public class Employee {
   @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
   private long id;
   @ManyToOne @JoinColumn(name="companyid")
   Company company;
   ....
}

@Entity
public class Company {
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private long id;

...
}

現在我將一個新創建的員工添加到一個獨立的公司。 我使用的代碼是這樣的:

Company company = em1.find(Company.class, 555L);
em1.close();

EntityTransaction et = em2.getTransaction();
et.begin();
Employee employee = new Employee();
employee.company = company;
em2.persist(employee);
et.close();

這項工作可以嗎?
hibernate會將公司合並到第二個EntityManager中,還是僅使用其id並持久保存員工對象?
可能會以某種方式復制我的公司對象或者拋出異常,說明DB中已存在具有相同ID的公司?

  • 在描述的情況下, Companyid將在持久化Employee對象時使用,但Company本身不會被合並(請注意, Employee是關系的擁有方)
  • 如果Company是暫時的而不是分離的,那么您將獲得“對象引用未保存的瞬態實例”錯誤
  • 如果使用cascade = CascadeType.PERSIST ,則會出現“已分離的實體傳遞給持久化”錯誤。

來自JPA規范:

如果X是托管實體,則會將其同步到數據庫。

  • 對於來自X的關系引用的所有實體Y,如果與Y的關系已使用級聯元素值cascade = PERSIST或cascade = ALL進行注釋,則將持久化操作應用於Y.
  • 對於來自X的關系引用的任何實體Y,其中與Y的關系未使用級聯元素值cascade = PERSIST或cascade = ALL進行注釋:
    • 如果Y是新的或被刪除,則刷新操作(以及標記為回滾的事務)將拋出IllegalStateException,否則事務提交將失敗。
    • 如果分離Y,則語義取決於關系的所有權。 如果X擁有該關系,則對該關系的任何更改都將與數據庫同步; 否則,如果Y擁有關系,則行為未定義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM