2016-12-28 51 views
0

我有一個一對多的關係&手機的實體是這樣的:一對多雙向映射是不是減少了員工之間的外鍵

@Entity 
public class Employee { 
    @Id 
    @Column(name = "EMP_ID") 
    private long id; 

    private String name; 

    @OneToMany(mappedBy = "owner") 
    private List<Phone> phones = new ArrayList<Phone>(); 
} 

@Entity 
public class Phone { 
    @Id 
    private long id; 
    private String phoneNumber; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "OWNER_ID") 
    private Employee owner; 
} 

在我的代碼,如果我救的手機第一,然後下一個員工:

session.save(phone); 
session.save(employee); 

然後我看到並插入查詢以保存Employee,然後插入查詢以保存Phone,然後更新查詢以更新Phone表中的owner_id。

因此,爲了避免在電話表的插入和更新,我已經添加下面的映射在我的手機實體:

@Entity 
public class Phone { 
    ... 
    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "OWNER_ID", insertable=false, updatable=false) 
    private Employee owner; 
} 

現在,在這種情況下,我看到插入的員工,然後在插入手機,但owner_id是空值。

如何在保存實體時確保owner_id不爲空?我想以另一種方式將手機和員工保存在我的代碼中。

回答

0

由於手機是兒童實體,因此需要員工參考保存。 通過使用cascadeType註釋手機,您的手機將與您的員工實體一起保存。修改後的實體將是這樣的:

@Entity 
public class Employee { 
    @Id 
    @Column(name = "EMP_ID") 
    private long id; 

    private String name; 

    @OneToMany(mappedBy = "owner",cascade = CascadeType.ALL) 
    private List<Phone> phones = new ArrayList<Phone>(); 

    /*getters and setters*/ 
} 

@Entity 
public class Phone { 
    @Id 
    private long id; 
    private String phoneNumber; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "OWNER_ID", insertable=false, updatable=false,nullable=false) 
    private Employee owner; 
    /*getters and setters*/ 

} 

而且具有如下修改保存邏輯:

Employee emp = new Employee(); 
private List<Phone> phones = new ArrayList<Phone>(); 
Phone phone = new Phone(); 
phone.setOwner(emp); 

phones.add(phone); 

emp.setPhones(phones); 

session.save(emp); 
+0

我不想在這裏使用級聯,你節省了員工,但我想先明確地保存手機,然後員工。那麼,我的方法是不可能的? – user3181365

+0

@ user3181365我猜不是,因爲你說過,在保存手機的時候,你需要'OWNER_ID'作爲非空字段。在這種情況下,'Phone'不會首先保存,並會因'OWNER_ID'爲空而拋出錯誤。因此,必須先保存員工,然後「電話」。 – CodeRunner

0

根據您的要求,沒有必要使用雙向的。請嘗試以下步驟

  1. 只需要在Phone實體中聲明@ManyToOne。因此請刪除員工實體的@OneToMany聲明。
  2. 休眠session.save(obj)返回Object的id。因此,只要保存電話第一,趕上id然後保存employee.See樣品

    session.save(phone); 
    long phoneOneId = phone.getId(); 
    Phone phoneOne = new Phone(); 
    phoneOne.setId(phoneOneId); 
    // You can also add another phone like phoneTwo, phoneThree, ... 
    List<Phone> phones = new ArrayList<Phone>(); 
    phones.add(phoneOne); 
    employee.setPhones(phones);