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


151

フィールドに注釈が付けられている場合、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;
}

回答:


121

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


それはinsertable=false,updatable=false、関係の片側で定義することを指します。
BalusC 2010

3
Personのupdatable = falseを使用すると、アドレスの更新時にPerson.nameの更新が無効になります(これがカスケードの目的であるため、同意しません)。また、@ Column定義は、外部キー(Person)と外部キーではない場合(更新を無効にするための参照エンティティがないため)、何か異なることをしているとも言っています。更新可能なjavadocを読むことで、一度永続化された場合、指定されたアドレスのPersonを変更することができなくなります。説明していただけますか?
Flowy

8
私はあなたが言う... to the @ManyToOne relationship with the ...つもりだったと思いますか?
Martin Konecny 2017

111

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

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


15
私はこの答えが受け入れられたものよりもはるかに優れていると強く信じています。受け入れられた答えは、挿入可能/更新可能な属性が関連エンティティの作成/更新に関係しているという感覚を伝えますが、これらの属性の背後にある本当の意図は、現在のエンティティの列の挿入/更新を防ぐことです。関連エンティティの作成/更新は、マッピングアノテーションのカスケード属性によって処理されます。
Jayant

25

BalusCPascal Thiventの回答に、次の一般的な用途を追加したいと思いますinsertable=false, updatable=false

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

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


1
シーケンスはJPAでもサポートされているため、JPAアノテーションを使用してシーケンスを定義することもできます。
e's

8

別の例は、データベースに日付の作成を処理させたい「created_on」列です。


Hibernateは、updatable = falseアノテーションに基づいて更新をブロックすることになっていますか?私のJPAリポジトリー・テストでは、このアノテーションが付いたcreated_on列は、問題なく更新を受け入れます。
chrisinmtown 2018年

1
@chrisinmtown Eclipselinkは、SQLに列をまったく含めません。それはHibernateと同じだと
思います
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.