2017-01-22 3 views
0

テーブル構造:ここでマップのJPA(Hibernate)マッピング。 java.util.Mapマッピングに使用する注釈は何ですか?

TABLE products (id (PK), name, price); 

TABLE orders (id (PK), customer_id, user_id); 

//product_quantity is quantity of product in particular order 
TABLE products_to_orders (product_id, order_id, product_quantity 
    PRIMARY KEY (product_id, order_id), 
    FOREIGN KEY (product_id) REFERENCES products (id) ON DELETE CASCADE, 
    FOREIGN KEY (order_id) REFERENCES orders (id) ON DELETE CASCADE 
); 

Order.javaです:

@Entity 
@Table(name = "orders") 
public class Order extends BaseEntity { 
... 
//this map holds Products and their quantities in order; 
     @ManyToMany(fetch = FetchType.EAGER) 
     @JoinTable(
       name = "products_to_orders" 
       ,joinColumns = @JoinColumn(name = "order_id") 
       ,inverseJoinColumns = @JoinColumn(name = "product_id") //it seems that i don't need this line 
     ) 
     @MapKeyJoinColumn(name = "product_id") 
     @Column(name = "product_quantity") 
     private Map<Product, Integer> productQuantityMap; 
... 

これらのアノテーションを使用して私のマッピングは動作しません。これは、例外を与える:org.hibernate.AnnotationException:@OneToManyを使用するか、マップされていないクラスのターゲット @ManyToMany: com.malikov.shopsystem.model.Order.productQuantityMap [java.langのをによって引き起こさ

。整数]

このマップに正しく注釈を付ける方法は管理できません。私はあなたの助けにたくさん感謝します! こちらはGitHubの私の返信サイトへのリンクです。 https://github.com/malikov-yurii/online-shop-management-system.git

UPDATE (ニールとマチェイから)2つの右のソリューションがあります。

Variation 1: 
    @ElementCollection(fetch = FetchType.EAGER) 
    @JoinTable(
      name = "products_to_orders" 
      ,joinColumns = @JoinColumn(name = "order_id") 
    ) 
    @MapKeyJoinColumn(name = "product_id") 
    @Column(name = "product_quantity") 
    private Map<Product, Integer> productQuantityMap; 

    Variation 2 
    @ElementCollection(fetch = FetchType.EAGER) 
    @CollectionTable(name = "products_to_orders") 
    @MapKeyJoinColumn(name = "product_id") 
    @Column(name = "product_quantity") 
    private Map<Product, Integer> productQuantityMap; 

答えて

0

この設定を試してください。代わりに、@ManyToManyと@CollectionTableの@ElementCollection代わりにご返信用@JoinTable

@ElementCollection 
@CollectionTable(name = "products_to_orders"   
@MapKeyJoinColumn(name = "product_id") 
@Column(name = "product_quantity") 
private Map<Product, Integer> productQuantityMap; 
+0

ありがとうございました!それはうまくいくようです! –

0

はあなたの選択したJPAプロバイダーの資料は、あなたのマップフィールドをマッピングする方法を含んでいませんか? DataNucleus JPAが提供するthis documentationに記載されています。簡単に言えば、あなたは(あなたがスキーマを設定するが、これらは不可欠なビットである場合にだけでなく、任意の追加の注釈)

@ElementCollection 
@JoinTable 
Map<Product, Integer> productQuantityMap; 

を含める必要があります。

+0

おかげで、私が試した ElementCollection(フェッチ= FetchType.EAGER) JoinTable( 名= "products_to_orders" 、joinColumns = JoinColumn(あなたのリンクの例は私の状況と同じではありません。 あなたのリンクの例は私の状況と同じではありません。 私は一番頑張っていますが、この問題を解決できません。 –

+0

「自分の状況と同じではない」を定義してください。エンティティ(おそらく)であり、基本的な値であるキーがあります。それがそのリンクの対象です。あなたのJPAプロバイダがそれをどう処理しないのか、どういうエラーが出るのかを好意的に定義してください。あなたの質問はManyToManyを使用することに関連しています。私が示した文書にはありません –

+0

申し訳ありません。それをチェックした。あなたの時間と注意してくれてありがとう! あなたとMaciejの両方の解決策に質問に添付します –

関連する問題