私は1対1のマッピングで次の関連クラスを持っています。
@Entity
public class EmployeeEntity
{
@Id
private String id;
private String name;
@OneToOne(mappedBy = "employeeEntity", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@Fetch(FetchMode.SELECT)
@JoinColumn(name = "empid")
private AddressEntity addressEntity;
...
...
getters & setters
}
@Entity
public class AddressEntity
{
@Id
@Column(unique=true, nullable=false)
@GeneratedValue(generator="gen")
@GenericGenerator(name="gen", strategy="foreign", parameters=@Parameter(name="property", value="employeeEntity"))
private String empId;
@OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@PrimaryKeyJoinColumn
private EmployeeEntity employeeEntity;
...
getters & setters
}
私はpostgresを使用しており、アドレステーブルに次の外部キー制約があるテーブル(employeeentity、addressentity)を持っています:外部キー制約: "fkakhilesh" FOREIGN KEY(empid)REFERENCES employeeentity(id)ON DELETE CASCADE
さまざまなREST呼び出しで次の要件があります。
- POSTREST呼び出し-アドレスを持つ従業員を作成する必要があります。
- POSTREST呼び出し-アドレスのない従業員を作成する必要があります。
- GETRest呼び出し-従業員を取得する必要があります。住所があればそれも来るはずです。
- PUT Rest呼び出し-従業員とアドレスを更新する必要があります(アドレスが存在する場合)。
- PUT Rest呼び出し-従業員と住所を更新する必要があります(住所が渡され、empidの住所テーブルにすでに存在する場合)
- PUT Rest呼び出し-従業員を更新してアドレスを作成する必要があります(アドレスが渡され、empidのアドレステーブルに存在しない場合)
1〜5の操作は問題なく実行できます。
主な問題は6つで、次の質問が頭に浮かびます。1. "getSession()。update(object)"を実行すると、hibernateのStaleStateExceptionが発生します。バッチ更新で更新[0]から予期しない行数が返されました。実際の行数:0; 予想される:1。アドレスが存在しない場合、これは「更新」では不可能ですか?更新中に新しいアドレスを作成できませんか?
ServiceImpl呼び出しを「getSession()。merge(object)」に変更する必要がありますか?この場合は「merge」を呼び出すことによってのみ処理できますか?パフォーマンスにどのように影響しますか?
マージすると、hibernateのIdentifierGenerationExceptionが発生します:nullの1対1のプロパティからIDを割り当てようとしました。私はここで何かが欠けていますか?
これは、休止状態のマッピングを変更することで解決できますか?またはカスケードに関連する何か。
ここで@GeneratedValue(generator = "gen")の重要性は何ですか?@GenericGeneratorで@parameterが使用されるのはなぜですか
私は休止状態に慣れておらず、休止状態のマッピングの深さを理解しようとしています。また、これを処理するための最良の方法として、デザインについて私に提案していただければ幸いです。