簡體   English   中英

OneToMany雙向映射未保存其外鍵

[英]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);

根據您的要求,無需使用雙向。 請嘗試以下步驟

  1. 只需要在Phone實體中聲明@ManyToOne 因此,從Employee實體中刪除@OneToMany聲明。
  2. 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.

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