[英]OneToMany bidirectional mapping is not saving its foreign key
我在“員工與電話”實體之間存在一對多關系,如下所示:
@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。
因此,為避免在Phone表上進行插入和更新,我在Phone實體中添加了以下映射:
@Entity
public class Phone {
...
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "OWNER_ID", insertable=false, updatable=false)
private Employee owner;
}
現在在這種情況下,我看到在Employee上插入,然后在Phone上插入,但是owner_id為null。
保存實體時,如何確保owner_id不為null? 我想用我的代碼保存Phone然后Employee,而不是其他方式。
由於電話是兒童實體,因此需要職員的參考才能保存。 通過用層疊類型注釋Phone,您的電話將與您的員工實體一起保存。 您修改后的實體將如下所示:
@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);
根據您的要求,無需使用雙向。 請嘗試以下步驟
@ManyToOne
。 因此,從Employee實體中刪除@OneToMany
聲明。 Hibernate session.save(obj)
返回Object的ID。 因此,只需先保存電話並捕獲id
然后保存員工即可。請參閱示例
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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.