当我需要部分更新BD中的数据时,我遇到了问题。
我拥有:我有三个链接的实体:
简介 - (1-m) - >人 - (1-1) - >地址
凡人 - >地址是懒惰的关系。它是通过optional = false选项实现的(允许hibernate使用代理)。
有什么问题:
我需要以这种方式更新Profile,我不需要提取与此配置文件链接的所有地址。
当我更新配置文件(不工作):
profile.setPersons(persons);
session.saveOrUpdate(profile);
throws:org.springframework.dao.DataIntegrityViolationException:not null属性引用null或transient值
这是因为Person-> Address关系具有optional = false选项
我需要去做:
//for each person
Address address = requestAddressFromDB();
person.setAddress(address);
persons.add(person)
//and only then
profile.setPersons(persons);
session.saveOrUpdate(profile);
profile.setPerson(person)
但是每次更新配置文件名称时我都不想拉所有地址。
问题是什么:
如何避免强制性人员 - >(非空)地址约束来保存我的个人资料而不拉动所有地址?
加成:
@Entity
public class Person{
@Id
@SequenceGenerator(name = "person_sequence", sequenceName = "sq_person")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "person_sequence")
@Column(name = "id")
private long personID;
@OneToOne(mappedBy="person", cascade=CascadeType.ALL, optional = false, fetch = FetchType.LAZY)
private Address address;
//.. getters, setters
}
@Entity
public class Address {
@Id
@Column(name="id", unique=true, nullable=false)
@GeneratedValue(generator="gen")
@GenericGenerator(name="gen", strategy="foreign", parameters=@Parameter(name="property", value="person"))
private long personID;
@PrimaryKeyJoinColumn
@OneToOne
private FileInfo person;
}
修改cascade
注释上的@OneToOne
元素,以便不对PERSIST
操作进行级联。这可能需要您在代码的某些区域手动保持对Address
的更新。如果没有真正使用级联,则不需要进行任何更改。
@OneToOne(mappedBy="person", cascade={CascadeType.MERGE, CascadeType.REMOVE, CascadeType.REFRESH}, optional = false, fetch = FetchType.LAZY)
private Adress address; //Do you know that Address is missing a 'd'?