BD のデータを部分的に更新する必要があるときに問題に直面しました。
私が持っているもの: リンクされたエンティティが 3 つあります。
プロフィール-- (1-m) -->人物-- (1-1) -->住所
Person -> Address は遅延関係です。optional=false オプション (休止状態がプロキシを使用できるようにする) によって実現されました。
何の問題:
このプロファイルにリンクされているすべてのアドレスをプルする必要がないように、プロファイルを更新する必要があります。
プロファイルを更新すると (動作しません):
profile.setPersons(persons);
session.saveOrUpdate(profile);
スロー: 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;
}