web-dev-qa-db-ja.com

JPA @Columnアノテーションを参照して、insertable = falseおよびupdatable = falseについて説明してください

フィールドにinsertable=false, updatable=falseという注釈が付けられている場合、値を挿入したり、既存の値を変更したりできないという意味ではありませんか?なぜそれをしたいのですか?

@Entity
public class Person {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @OneToMany(mappedBy="person", cascade=CascadeType.ALL)
    private List<Address> addresses;
}

@Entity
public class Address {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ManyToOne
    @JoinColumn(name="ADDRESS_FK")
    @Column(insertable=false, updatable=false)
    private Person person;
}
127
Thang Pham

問題の関連エンティティの作成/更新の責任currentエンティティにない場合、これを行います。例えば。 PersonAddressがあります。 Personエンティティの責任ではないという理由だけで、Addressエンティティ内のAddressエンティティとのinsertable=false, updatable=false関係に@OneToManyを追加したいPersonを作成または更新します。それは逆です。

105
BalusC

insertable=false, updatable=falseの定義は、エンティティでフィールドを複数回マップする必要がある場合に役立ちます。通常は次のとおりです。

これはIMOであり、意味論的なものではなく、間違いなく技術的なものです。

93
Pascal Thivent

BalusCPascal Thivent別の答えに追加したいと思いますinsertable=false, updatable=falseの一般的な使用:

idではなく、何らかの種類のシーケンス番号である列を考えてみましょう。シーケンス番号を計算する責任は、必ずしもアプリケーションに属しているとは限りません。

たとえば、シーケンス番号は1000から始まり、新しいエンティティごとに1つずつ増加します。これはデータベースで簡単に、そして非常に適切に行われます。そのような場合、これらの構成は理にかなっています。

19
Magnilex

もう1つの例は、データベースが日付の作成を処理できるようにする「created_on」列です。

7
Johny19