Я пытаюсь реализовать родительские дочерние отношения на традиционных Order и Items таблиц. Для этого я использую однонаправленную связь один-ко-многим, но я могу сделать либо операцию «сохранить», либо операцию «удалить», по одному за раз.
Если я установил inverse="false"
, я могу создать новый заказ (с элементами), но не могу удалить его, потому что hibernate пытается сначала удалить запись заказа, и это не удается из-за ссылки в таблице элементов
С другой стороны, если я установлю inverse="true"
, тогда Order может быть удален, но не создан, так как он пытается сначала создать запись OrderItems, которая завершается неудачно из-за отсутствия ссылки в таблице Order (orderId не является нулевым в таблице Items)
Двунаправленная ассоциация также является болью, потому что она приводит к округлости в графах объектов. Кто-нибудь может предложить мне решение?
Мое отображение спящего режима:
<class name="Order" table="ORDERS">
<id column="ID" name="id" type="long">
<generator class="native" />
</id>
<property name="orderDate" type="timestamp" />
<property name="customer" type="string" />
<set cascade="all-delete-orphan" name="items" inverse="true" lazy="true">
<key column="orderId" not-null="true" />
<one-to-many class="OrderItem" />
</set>
</class>
<class name="Item" table="Items">
<id column="id" name="itemId" type="long">
<generator class="native" />
</id>
<property name="product" type="string" />
<property name="quantity" type="int" />
</class>
Order.java:
public class Order implements java.io.Serializable {
private Long id;
private Date orderDate;
private String customer;
private Set<Item> items;
public Long getId() {
return id;
}
public Date getInvDate() {
return invDate;
}
public String getCustomer() {
return customerId;
}
public Set<Item> getItems() {
return items;
}
public void setId(Long id) {
this.id = id;
}
public void setOrderDate(Date orderDate) {
this.orderDate= orderDate;
}
public void setCustomer(String customer) {
this.customer = customer;
}
public void setItems(Set<Item> items) {
this.items = items;
}
}
Item.java
public class Item implements java.io.Serializable {
private Long itemId;
private String product;
private int quantity;
public Long getItemId() {
return itemId;
}
public String getProduct() {
return product;
}
public int getQuantity() {
return quantity;
}
public void setItemId(Long itemId) {
this.itemId = itemId;
}
public void setProduct(String productId) {
this.product = product;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
}
OrderManager.java
public class OrderManagerBase {
public Long save(Order theOrder) throws RemoteException {
Session session = HbmUtils.getSessionFactory().getCurrentSession();
Transaction tx = null;
Long orderId = null;
try {
tx = session.beginTransaction();
session.persist(theOrder);
tx.commit();
orderId = theOrder.getId();
} catch (RuntimeException e) {
if (tx!=null)
tx.rollback();
throw new RemoteException("Order could not be saved");
}finally{
if (session.isOpen())
session.close();
}
return orderId;
}
public Long delete(Order order) throws RemoteException {
Session session = HbmUtils.getSessionFactory().getCurrentSession();
Transaction tx = null;
Long orderId = order.getId();
try {
tx = session.beginTransaction();
session.delete(order);
tx.commit();
} catch (RuntimeException e) {
tx.rollback();
orderId = null;
}finally{
if (session.isOpen())
session.close();
}
return orderId;
}
public Order getOrder(long cid) throws RemoteException {
Session session = HbmUtils.getSessionFactory().getCurrentSession();
Transaction tx = null;
Order theOrder = null;
try {
tx = session.beginTransaction();
Query q = session.createQuery("from Order as order " +
"left outer join fetch order.items " +
"where order.id = :id").setReadOnly(true);
q.setParameter("id", cid);
theOrder = (Order) q.uniqueResult();
tx.commit();
} catch (RuntimeException e) {
if (tx!=null)
tx.rollback();
e.printStackTrace();
}finally{
if (session.isOpen())
session.close();
}
return theOrder;
}
}
Таблица:
CREATE TABLE Orders (
id bigint(20) NOT NULL AUTO_INCREMENT,
orderDate datetime DEFAULT NULL,
PRIMARY KEY (id),
)
CREATE TABLE Items (
id bigint(20) NOT NULL AUTO_INCREMENT,
orderId` bigint(20) NOT NULL,
product varchar(50) DEFAULT NULL,
quantity bigint(20) DEFAULT NULL,
PRIMARY KEY (id),
CONSTRAINT FK_orderitems_1 FOREIGN KEY (orderId) REFERENCES Orderss (id)
)