7

私はOracleデータベースを使用しており、挿入前にIDを生成して保存するためのシーケンスとトリガーがあります。

CREATE SEQUENCE CASE_SEQ START WITH 1001 INCREMENT BY 1 NOMAXVALUE; 

CREATE OR REPLACE TRIGGER CASE_TR_SEQ
BEFORE INSERT ON CASE FOR EACH ROW
BEGIN
  SELECT CASE_SEQ.NEXTVAL INTO :NEW.CASE_ID FROM DUAL;
END;
/

次に、プロパティを持つ単純なエンティティがあります。

@Id
@Column(name = "CASE_ID", insertable = false, updatable = false)
private Long caseId;

...プロジェクトをビルドしようとすると、次のようになります。

Exception [EclipseLink-46] (Eclipse Persistence Services - 2.3.2.v20111125-r10461):
org.eclipse.persistence.exceptions.DescriptorException
Exception Description: There should be one non-read-only mapping defined for the
primary key field [CASE.CASE_ID].

挿入可能または更新可能なキーワードを削除すると、機能します。JPAを使用してIDを生成する方法がたくさんあることを知っています.JPAはOracleシーケンスを使用(呼び出し)してIDを設定(生成)することもできます。しかし、なぜ私の解決策が間違っているのかを理解しようとします。@Id アノテーションと一緒に両方のキーワードを使用できないのはなぜですか? 私の考えは、JPAによるcaseIdの挿入または更新を禁止したいということです。

1) 適切な解決策は何ですか? @Id のみを使用する必要があります:

@Id
@Column(name = "CASE_ID")
private Long caseId;

またはより良い(より安全な)insertable = falseも定義します:

@Id
@Column(name = "CASE_ID", insertable = false)
private Long caseId;

2)@Idのupdatable = falseには意味がないことを理解しています(主キーの更新には意味がありませんが、生のSQLで可能です)が、それはどういう意味ですか(有益な場合の例はありますか):

@Id
@Column(name = "CASE_ID", updatable = false)
private Long caseId;

編集 2012-04-13

私はいくつかのテストを行いました:

実在物

@Id
@Column(name = "CASE_ID")
private Long caseId;

JPAログ

INSERT INTO CASE (CASE_ID, CASE_DATE, INFO) VALUES (?, ?, ?)
bind => [3 parameters bound]|#]

JPAはCASE_IDを保存しようとするため(これは、トリガーによってOracleシーケンスのIDに置き換えられます)、これは安全ではありません。

実在物

@Id
@Column(name = "CASE_ID", insertable = false)
private Long caseId;

メソッドの作成

public void createCase(final Case caseData) {
    caseData.setCaseId(-1001L);
    em.persist(caseData);
}

JPAログ

INSERT INTO CASE (CASE_DATE, INFO) VALUES (?, ?)
bind => [2 parameters bound]|#]

CASE_ID は挿入コマンドの一部ではないため、これで問題ありません。

注釈 ID:

public void update() {
    Case update = em.find(Case.class, 1023L);
    update.setCaseId(1028L);
}

Exception [EclipseLink-7251] (Eclipse Persistence Services - 2.3.2.v20111125-r10461):
org.eclipse.persistence.exceptions.ValidationException
Exception Description: The attribute [caseId] of class
[com.wordpress.kamiluv.jsfprototype.model.entity.Case] is mapped to a primary
key column in the database. Updates are not allowed.

では、最新バージョンが最も安全に見えますよね?

4

1 に答える 1