Java JPA:如何使用OneToMany注释向列表添加新项目

Java JPA:如何使用OneToMany注释向列表添加新项目,java,jpa,one-to-many,cascading,Java,Jpa,One To Many,Cascading,我有两张桌子。一个叫员工,另一个叫电话,一个员工可以有多部电话 员工类别: @Entity @Table(name = "employee") public class Employee { @Id @Column(name = "id", unique = true, nullable = false) @GeneratedValue(strategy = javax.persistence.GenerationType.IDENTITY) private I

我有两张桌子。一个叫员工,另一个叫电话,一个员工可以有多部电话

员工类别:

@Entity
@Table(name = "employee")
public class Employee {

    @Id
    @Column(name = "id", unique = true, nullable = false)
    @GeneratedValue(strategy = javax.persistence.GenerationType.IDENTITY)
    private Integer id;

    @Column(name = "name", unique = true, nullable = false, length = 25)
    private String name;

    @OneToMany(mappedBy="owner", fetch= FetchType.EAGER, orphanRemoval=true, cascade={CascadeType.ALL})
    private List<Phone> phones;
假设我想向现有员工添加一部电话。我正在这样做:

Phone phone = new Phone();
phone.setOwner(employee);
phone.setPhoneNumber("999-555-0001");
phone.setPhoneType("home");
employee.getPhones().add(phone);        
dao.merge(employee); // Is it possible to get this to both persist new phones and update existing phones that were changed?

我不知道如何合并新手机,因为电话集中的一些手机已经被保留了。我必须手动保存每个电话吗?请举个例子,不胜感激。我研究了级联,但似乎无法使其工作。我收到的错误是:java.lang.IllegalStateException:实体副本已分配给其他实体。

我认为问题可能出在Phone类中的join列注释中。您正在指定
employee\u id
的联接列,但是在employee类中,id字段的
@列
注释映射到列
id

尝试更改/同步联接列:

@ManyToOne(fetch = FetchType.EAGER, targetEntity=your.package.here.Employee.class)
@JoinColumn(name = "id")
private Employee owner;

Employee.java

@Id
@Column(name = "employee_id", unique = true, nullable = false)
@GeneratedValue(strategy = javax.persistence.GenerationType.IDENTITY)
private Integer id;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "employee_id", targetEntity=your.package.here.Employee.class)
private Employee owner;
Phone.java

@Id
@Column(name = "employee_id", unique = true, nullable = false)
@GeneratedValue(strategy = javax.persistence.GenerationType.IDENTITY)
private Integer id;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "employee_id", targetEntity=your.package.here.Employee.class)
private Employee owner;

你收到错误了吗?你能把它寄出去吗?另外,我假设您省略了每个字段所需的getter和setter方法。对于级联,请在@OneToMany注释中添加[cascade=CascadeType.ALL,orphanRemoving=true],您是否有@Transactional方法?这似乎是Hibernate 4.1.3+中的一个错误。这在Hibernate4.1.0中不会发生。请参阅:Phone表中join列的名称不需要与Employee表中主键列的名称匹配,事实上,问题中的原始映射似乎是正确的。此外,如果列表是非类型化的(不使用泛型),则targetEntity仅在Employee实体中需要,并且仅在关系注释(@OneToMany、@ManyToMany等)中指定。