当我需要在BD中部分更新数据时,我遇到了问题。
我有什么: 我有三个链接的实体:
个人资料 - (1-m) - > 人 - (1-1) - >的地址
凡人 - >地址是懒惰的关系。它是通过optional = false选项实现的(允许hibernate使用代理)。
问题:
我需要以这种方式更新个人资料,我无需提取与此个人资料相关联的所有地址。
当我更新个人资料(不工作)时:
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)
但是每次更新个人资料名称时我都不想提取所有地址。
问题是什么:
如何在不拉动所有地址的情况下避免使用强制性人员>(非空)地址约束来保存我的个人资料?
ADDITION :
@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;
}
答案 0 :(得分:1)
修改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'?