Добавить данные к объектам в отношениях "многие ко многим" обоими способами,
Рассмотрим этот класс:
@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();
База данных не обновляется в приведенном выше примере. Разве это не должно работать в обе стороны? Есть что-то, что я должен сделать?
моток
2 ответа
Прежде всего, вы должны всегда устанавливать обе стороны отношений.
Причина, по которой это не работает, когда вы устанавливаете только со стороны Продукта, заключается в том, что отношения принадлежат стороне Заказа.
Попробуйте добавить каскад в ваш параметр @ManyToMany следующим образом:
@ManyToMany(
mappedBy="productList",
fetch=FetchType.EAGER,
cascade = {CascadeType.ALL}
)
См. Документацию по Hibernate, в которой ясно сказано об этой проблеме.