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

问题描述 投票:0回答:1

当我需要部分更新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;
}
spring hibernate jpa lazy-loading datapersistance
1个回答
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'?
© www.soinside.com 2019 - 2024. All rights reserved.