Hibernate:需要更新父实体而不必拉出所有子级联

时间:2013-08-01 09:30:08

标签: spring hibernate jpa lazy-loading datapersistance

当我需要在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;
}

1 个答案:

答案 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'?