【发布时间】:2010-12-28 04:58:54
【问题描述】:
我有下面的实体类。当用户第一次注册时,只提供用户名和密码,因此帐户列表(想想个人资料)是空的。后来,当他们添加一个帐户时,用户对象在客户端更新,传递给服务器,然后调用 entityManager.merge(user)。当用户被合并时,账户被添加到数据库中 6 次,提供的地址被添加 3 次。我不确定为什么。我希望只添加一次帐户,并且只添加一个地址。对可能发生的事情有任何想法吗?
@Entity
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="id")
private int id;
@OneToMany(cascade=CascadeType.ALL)
@JoinTable(name="user_accounts")
private List<Account> accounts;
//...getters and setters ...
}
@Entity
public class Account implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="id")
private long id;
@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="address")
private Address address;
//...getters and setters...
}
@Entity
public class Address implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="id")
private int id;
@Column(name="street")
private String street;
@Column(name="city")
private String city;
@Column(name="state")
private String state;
@Column(name="zip")
private String zip;
//...getters and setters...
}
【问题讨论】:
-
如果您不更改名称,您可以删除 @Column(name="id") 或 @Column(name="zip") 之类的内容。
-
实时服务器默认为所有大写的表和列名,而我的测试服务器默认为小写,所以看起来比更改设置更容易。
-
您找到解决方案了吗?
-
从来没有,但我猜这是级联更新导致创建多个实体的结果
-
您是否尝试过覆盖这些类的
equals方法?
标签: java jpa merge duplicates