【发布时间】:2015-11-07 10:21:02
【问题描述】:
我是新来的,我也是 JPA 的新手!我开发了一个带有以下实体的小型 JPA 应用程序:
客户(姓名、名字、身份证)有一个地址(邮政编码、城市、身份证)。这些实体之间的关系是多对一(客户的视角)和一对多(地址的视角)。
代码(部分)如下:(没有getter/setter)
@Entity
public class AddressEntity implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
private String city;
private int zipCode;
@Column
@ElementCollection(targetClass=CustomerEntity.class)
private List<CustomerEntity> customers;
public AddressEntity() {}
@OneToMany(cascade=CascadeType.ALL,
fetch=FetchType.EAGER,
mappedBy="addressentity")
public List<CustomerEntity> getCustomers() {
return customers;
}
@Entity
public class CustomerEntity implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int primaryKey;
private String preName, surName;
@ManyToOne(targetEntity=AddressEntity.class, cascade=CascadeType.ALL)
@JoinColumn(name="Address_ID")
private AddressEntity address;
public CustomerEntity() {}
}
现在我想添加两个人: 1) 巴特辛普森 1234 斯普林菲尔德 2) 荷马辛普森 1234 斯普林菲尔德
问题是地址表中Springfield出现了两次。但这不是规范化数据库的意义!我怎么能意识到只有在之前不存在的情况下才添加 AddressEntity!
感谢您的回答, 埃尼亚克
【问题讨论】:
-
可能有更好的方法,但尝试先将地址持久化,然后将其添加到 2 个用户并持久化它们。为此,您必须将
CustomerEntity中的CascadeType.ALL删除或更改为其他内容(CascadeType.REFRESH可能会这样做)。无论如何使用 ALL 似乎有点奇怪,主要是因为在您当前的代码中,删除客户将摆脱可能分配给另一个用户的地址。 -
感谢您的建议!但是你描述的方式和之前的效果是一样的
-
其中一些问题取决于您正在处理的实体的附加性,您能否在保留这些实体的位置添加代码摘录?
标签: java hibernate jpa mapping database-normalization