0

私は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呼び出しで次の要件があります。

  1. POSTREST呼び出し-アドレスを持つ従業員を作成する必要があります。
  2. POSTREST呼び出し-アドレスのない従業員を作成する必要があります。
  3. GETRest呼び出し-従業員を取得する必要があります。住所があればそれも来るはずです。
  4. PUT Rest呼び出し-従業員とアドレスを更新する必要があります(アドレスが存在する場合)。
  5. PUT Rest呼び出し-従業員と住所を更新する必要があります(住所が渡され、empidの住所テーブルにすでに存在する場合)
  6. PUT Rest呼び出し-従業員を更新してアドレスを作成する必要があります(アドレスが渡され、empidのアドレステーブルに存在しない場合)

1〜5の操作は問題なく実行できます。

主な問題は6つで、次の質問が頭に浮かびます。1. "getSession()。update(object)"を実行すると、hibernateのStaleStateExceptionが発生します。バッチ更新で更新[0]から予期しない行数が返されました。実際の行数:0; 予想される:1。アドレスが存在しない場合、これは「更新」では不可能ですか?更新中に新しいアドレスを作成できませんか?

  1. ServiceImpl呼び出しを「getSession()。merge(object)」に変更する必要がありますか?この場合は「merge」を呼び出すことによってのみ処理できますか?パフォーマンスにどのように影響しますか?

  2. マージすると、hibernateのIdentifierGenerationExceptionが発生します:nullの1対1のプロパティからIDを割り当てようとしました。私はここで何かが欠けていますか?

  3. これは、休止状態のマッピングを変更することで解決できますか?またはカスケードに関連する何か。

  4. ここで@GeneratedValue(generator = "gen")の重要性は何ですか?@GenericGeneratorで@parameterが使用されるのはなぜですか

私は休止状態に慣れておらず、休止状態のマッピングの深さを理解しようとしています。また、これを処理するための最良の方法として、デザインについて私に提案していただければ幸いです。

4

2 に答える 2

3

私はこれを修正しました。この 1 対 1 のマッピングはややトリッキーで、最初に思ったほど単純ではありません。ここでは双方向の 1 対 1 マッピングを使用しているため、更新中に EmployeeEntity と AddressEntity の両方のセッターを呼び出して相互に設定することが重要です。例えば:

employeeEntity.setAddressEntity(addressEntity) および addressEntity.setEmpoyeeEntity(empoyeeEntity) を明示的に呼び出す必要があります。

単独で employeeEntity.setAddressEntity(addressEntity) を設定しても機能しません。

于 2013-02-28T05:52:02.047 に答える
0
  • 常に整数 ID を使用.getSession.saveOrUpdate(entity);し、保存または更新に使用します。

  • 1 対 1 のマッピングconstrained=trueでは、子について言及する必要があります。Child Id を Parent Id と同じにします。

  • これらの行を子 ID に使用します。Java 属性の構文がわかりません。

<generator class="foreign">
    <param name="property">employeeEntity</param>
</generator>
  • また、 Fetch タイプとCascade.All子から削除します。Selectデフォルトのフェッチモードはどちらでもいいと思います。Cascade は、通常、親子関係を担当する Parent 部分に使用されます。
于 2013-02-14T16:08:15.397 に答える