0

当我需要部分更新 BD 中的数据时,我遇到了这个问题。

我所拥有的: 我有三个链接的实体:

个人资料-- (1-m) -->-- (1-1) -->地址

其中 Person -> Address 是惰性关系。它是通过 optional=false 选项实现的(允许休眠使用代理)。

什么问题:

我需要以这种方式更新配置文件,我不需要提取与此配置文件链接的所有地址。

当我更新个人资料时(不工作):

profile.setPersons(persons);
session.saveOrUpdate(profile);

throws : org.springframework.dao.DataIntegrityViolationException: not null 属性引用 null 或瞬态值

发生这种情况是因为 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)

但我不想每次更新个人资料名称时都提取所有地址。

问题是什么:

如何避免强制 Person->(not null)Address 约束来保存我的个人资料而不提取所有地址?

补充

@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;
}
4

1 回答 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'?
于 2013-08-01T09:46:58.400 回答