【问题标题】:Add data to objects in a many-to-many relationship both ways,以多对多关系向对象添加数据,
【发布时间】:2014-11-13 11:47:22
【问题描述】:

考虑这个类:

@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;

   @OneToOne(optional=false,cascade=CascadeType.ALL, mappedBy="order",
   targetEntity=Invoice.class)
   private Invoice invoice;

   @ManyToOne(optional=false)
   @JoinColumn(name="CUST_ID",referencedColumnName="CUST_ID")
   private Customer customer;

   @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

}

现在,如果我想将产品添加到订单中,我只需这样做:

    EntityManagerFactory emFactory = Persistence.createEntityManagerFactory("something");
    EntityManager em = emFactory.createEntityManager();
    EntityTransaction trans = em.getTransaction();

    trans.begin();

    Order order = em.find(Order.class, 1);
    Product product = em.find(Product.class, 51);

    order.getProductList().add(product);

    trans.commit
    em.close();
    emFactory.close();

上面的例子有效——我可以在数据库中看到它。如果我改为这样做:

 EntityManagerFactory emFactory = Persistence.createEntityManagerFactory("something");
    EntityManager em = emFactory.createEntityManager();
    EntityTransaction trans = em.getTransaction();

    trans.begin();

    Order order = em.find(Order.class, 1);
    Product product = em.find(Product.class, 51);

    product.getOrderList().add(order);

    trans.commit
    em.close();
    emFactory.close();

在上面的例子中数据库没有更新。它不应该双向工作吗?有什么我应该做的吗?

汉克

【问题讨论】:

    标签: java jpa many-to-many openjpa


    【解决方案1】:

    首先,您应该始终设置关系的双方。

    仅从产品端设置它不起作用的原因是关系归订单端所有。

    【讨论】:

      【解决方案2】:

      尝试像这样在 @ManyToMany 选项上添加级联:

      @ManyToMany(
              mappedBy="productList",
              fetch=FetchType.EAGER,
              cascade = {CascadeType.ALL}
      )
      

      请参阅Hibernate Documentation,这对这个问题非常清楚

      【讨论】:

      • 您是否尝试在您的 Order 类中添加 @ManyToMany(fetch=FetchType.EAGER,cascade = {CascadeType.ALL})
      猜你喜欢
      • 2014-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-22
      • 2020-04-15
      • 1970-01-01
      • 1970-01-01
      • 2018-11-19
      相关资源
      最近更新 更多