15

PurchaseList.javaとPurchaseListItems.javaという2つのクラスがあります

PurchaseListをPurchaseListItemsにマップする必要があります

PurchaseList.java

@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name="pl_id",referencedColumnName="id")
private List<PurchaseListItems> purchaseListItems;

PurchaseListItems.java

@ManyToOne
@JoinColumn(name="pl_id")
private PurchaseList purchaseListId;

すべて問題ありませんが、pl_idでnullが発生しています。どこが間違っているか教えてください

4

7 に答える 7

8

何らかの理由で、によってマップされたものは、postgressqlとHibernate4では機能しませんでした

以下のマッピングが機能しました

PurchaseList.java

@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name="pl_id",nullable=false)
private List<PurchaseListItems> purchaseListItems;

PurchaseListItems.java

@ManyToOne
@JoinColumn(name="pl_id", nullable=false,insertable=false,updatable=false )
private PurchaseList purchaseListId;

注:postgresのid列のIdentityを使用するか、Sequenceを明示的に指定する必要があります。

@GeneratedValue(strategy=GenerationType.IDENTITY)
于 2015-04-20T16:29:48.633 に答える
5

マッピングは実際には2つの独立した一方向の関係を定義します。必要なのは1つの双方向関係です。次のコードは双方向関係を確立します

@OneToMany(cascade = CascadeType.ALL, mappedBy = "purchaseListId")
@JoinColumn(name="pl_id",referencedColumnName="id")
private List<PurchaseListItems> purchaseListItems;

指定されたリレーションが実際に単一のリレーションを形成していることをプロバイダーが自動的に判断する方法がないため、mappedBy属性が必要です。インスタンスメンバーのJavaタイプを使用することもできますが、同じタイプのメンバーが複数ある場合はどうでしょうか。そして、2つの単一の関係がある多くのシナリオがあります。例:

OneToMany:ユーザー-> ForumThread(ユーザーが作成したスレッド)

ManyToOne:ForumThread-> User(スレッドを閉じたユーザー。明らかにスレッドを開始したユーザーとは限りません)

これらは2つの独立した関係であり、そのように扱う必要があります。タイプと多重度が一致したという理由だけで、永続性がそれから双方向の関係を作成した場合は、非常に驚​​かれることでしょう。

また、双方向の関係はJPAプロバイダーによって自動的に管理されないことに注意してください。つまり、逆側はオブジェクトモデルで自動的に更新/設定されないため、データベースでは更新されません。あなたはそれを自分でしなければなりません。ちなみに、私のすべてのプロジェクトでは、双方向の関係はお尻の痛みでした、そして私はそれらを避けることが賢明だと思います。

于 2013-03-14T16:35:58.453 に答える
2
  1. @JoinColumnアノテーションは、関係の@ManyToOne側に属しますが、@ OneToMany側には属しませんが、@OneToMany側から削除します。

  2. カスケードは、DELETE / READ / UPDATE操作をカスケードするために使用されます...が、外部キーの「子」側のID列に自動的に入力されません。実際、FK関係のいずれかの側にあるオブジェクトへのJava参照は入力されません。双方向関係の両側で関係データを手動で設定する必要があります。

    myPurchaseListItem.setPurchaseList(myPurchaseList);
    myPurchaseList.setPurchaseListItem(myPurchaseListItem);

    JPA 2仕様から:

    管理対象エンティティ間の双方向の関係は、関係の所有側が保持する参照に基づいて維持されます。所有側で保持されているメモリ内参照と、反対側で保持されている参照が変更されたときに互いに一貫性を保つことは、開発者の責任です。一方向の1対1および1対多の関係の場合、関係のセマンティクスが順守されていることを保証するのは開発者の責任です。[29]

    関係の逆側への変更が所有側で適切な更新をもたらすことを確認して、変更がデータベースに同期されたときに変更が失われないようにすることが特に重要です。

于 2013-03-14T05:46:51.683 に答える
1
for(PurchaseListItems item:purchaseListItemsList)
item.purchaseListId(PurchaseList);

これは、オブジェクトを作成しているときに見逃したものです。

あなたの答えのためのThnaks

于 2013-03-13T08:01:40.003 に答える
0

これを試して

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "purchaseListId")
于 2013-03-08T05:26:04.413 に答える
0

PurchaseListItems値を作成するときに、 purchaseListIdに有効な値(作成されたPurchaseListインスタンス)を入力したかどうかを確認します。

以下のコードのようにmappedByを使用して、関係を維持するために多面的なものにすることをお勧めします。

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "purchaseListId")
@JoinColumn(name="pl_id",referencedColumnName="id")
private List<PurchaseListItems> purchaseListItems;
于 2013-03-12T12:14:18.087 に答える
0

jpa仕様は良さそうですが、データベースで有効な親子関係を指定していることを確認してください。参照がない場合は、nullを返します。

于 2013-03-08T05:23:28.083 に答える