sql >> データベース >  >> RDS >> Oracle

オブジェクトをjpaに保存する前にIDを知るにはどうすればよいですか?

    @GeneratedValueタイプIDを使用すると、(実際に書き込む前に)その値を事前に知ることはできません。ただし、Beanを永続化すると、そのBeanインスタンスにidフィールドが入力され、追加のクエリを実行しなくても取得できます。言い換えれば:

    MyEntiry myEnt = new MyEntity(); //the id field is null now
    entityManager.persist(myEnt);//the id field is populated in myEnt now
    Long id = myEnt.getId();
    

    また、EntityManagerの方法によっても異なります が構成されている場合、そのIDを取得する前に、最初にトランザクションを(手動で)コミットする必要がある場合もあります。

    コメントごとに更新

    保存や更新の前にエンティティをインターセプトして何かを実行したい場合は、JPAライフサイクルリスナーを使用できます(JPAバージョン2を使用している場合):リスナーとコールバックを使用してJPAライフサイクルイベントを処理します。

    基本的に、validate()を作成できます Beanのメソッドで、@PrePersistで注釈を付けます および@PreUpdate その中で検証を行います(コードが空の場合は、IDの値に設定します)

    2番目のコメントごとの更新

    はい、正直なところ、今考えたところです。IDが自動生成された場合、pre-persistイベントの後にデータが入力される可能性があるため、pre-persistコードを実行しても、IDが何であるかがわかりません。 (この例では、IDにリンクするのは自動生成されないが、手動で設定されることに気付くかもしれません)この場合にできることは、エンティティにブールフィールドを追加することです(@Transientで注釈が付けられています)。 したがって、永続化されません)isCodeEmptyと呼ばれます (特に初期化されていない場合、デフォルトではfalseです)。次に、@PrePersistで コードフィールドの値が空かどうかを確認し、空の場合はブール値をtrueに設定する注釈付きメソッド。次に、setId(...)をリファクタリングします (idフィールドの設定は別として)このブール値をチェックし、trueの場合、コードフィールドの値をidフィールドの値に設定するようなメソッド:

    public class YourEntity {
    
    @Transient
    private boolean isCodeEmpty;
    
    public void setId(Whatever id) {
     this.id = id;
     if(isCodeEmpty) {
      this.code = id;
      //if necessary:
      //this.isCodeEmpty = false;
     }
    }
    
    @PrePersist
    public void validate() {
     if(code == null || code.isEmpty()) {
      isCodeEmpty = true;
     }
    
    }
    
    
    }
    


    1. PGAdminからCSVファイルをインポートしようとしたときにアクセスが拒否されました

    2. 特定のテーブルを使用するすべてのクエリを検索する

    3. SQLServerのパフォーマンスTOPCPUクエリ-1

    4. Androidを搭載したドライバーJDBCPostgreSQL