1

私はJPAを初めて使用するので、多対多の関係について質問があります(0からより多くの実装):

あなたが次のような関係を持っている場合:

ここに画像の説明を入力してください

前述のように、製品は注文なしで存在でき(通常、新製品が到着すると追加されます)、後で1つ以上の注文で使用できます。注文には少なくとも1つ以上の商品が含まれている必要があります。

あなたは関係を述べなければなりません

@Entity(name = "ORDERS") 
public class Order {
       @Id 
       @Column(name = "ORDER_ID", nullable = false)
       @GeneratedValue(strategy = GenerationType.AUTO)
       private long orderId;

   @Column(name = "CUST_ID")
   private long custId;

   @Column(name = "TOTAL_PRICE", precision = 2)
   private double totPrice;     

   @ManyToMany(fetch=FetchType.EAGER)
   @JoinTable(name="ORDER_DETAIL",
           joinColumns=
           @JoinColumn(name="ORDER_ID", referencedColumnName="ORDER_ID"),
     inverseJoinColumns=
           @JoinColumn(name="PROD_ID", referencedColumnName="PROD_ID")
   )
   private List<Product> productList;       
 ...............
   The other attributes and getters and setters goes here
}

@Entity(name = "PRODUCT") 
public class Product {
       @Id
       @Column(name = "PROD_ID", nullable = false)
       @GeneratedValue(strategy = GenerationType.AUTO)
       private long prodId;

   @Column(name = "PROD_NAME", nullable = false,length = 50)
   private String prodName;

   @Column(name = "PROD_DESC", length = 200)
   private String prodDescription;

   @Column(name = "REGULAR_PRICE", precision = 2)
   private String price;

   @Column(name = "LAST_UPDATED_TIME")
   private Date updatedTime;
   @ManyToMany(mappedBy="productList",fetch=FetchType.EAGER)
   private List<Order> orderList;       
   ...............
   The other attributes and getters and setters goes here
}

ゼロ対多の関係は、(現時点で)注文にリンクされていない製品をそのまま保持することはまだ可能ですか?

ただし、注文で製品を使用する場合は、製品の注文リストを更新し、注文の製品リストも更新する必要があります。これを強制するにはどうすればよいですか、それともJPAは私のためにこれを実行しますか?

4

2 に答える 2

0
  1. 注文しなくても製品を存続させることができます。

  2. 関係の反対側を手動で更新する必要があります。JPAはあなたのためにそれをしません。(もちろん、1つの注文を保存してから製品を再フェッチすると、注文のコレクションが更新されます)

編集 2番目のポイントを説明するには:

Product persitentProduct = ... //some product
Order newOrder = new Order();
newOrder.getProducts().add(persitentProduct);
//at this point : persistentProduct.getOrders().contains(newOrder)==false
entityManager.persist(newOrder);
//at this point nothing has changed on the other side of the relationship:
// i.e. : persistentProduct.getOrders().contains(newOrder)==false
于 2013-01-04T10:52:01.413 に答える
0

次に、次のようなものが得られます。

public class Order {
private List products;
...
public void addProduct(Product product) {
    this.products.add(product);
    if !(product.getOrders().contains(product) {
        product.getOrders().add(this);
    }
}
...
}



public class Product {
    private List orders;
    ...
    ...
}

右?または、これは間違っていると思いますか

于 2013-01-07T10:22:39.617 に答える