Только один из «создать» или «удалить», в родительской дочерней ассоциации, работает одновременно - PullRequest
2 голосов
/ 25 июля 2010

Я пытаюсь реализовать родительские дочерние отношения на традиционных 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)
)

1 Ответ

1 голос
/ 26 июля 2010

на родительском заказе:

<set name="items" access="field" inverse="true" cascade="all" order-by="id">
    <key column="parent_order_id" />
    <one-to-many class="com.example.Item" />
</set>

void addItem(Item item) {
    items.add(item);
    item.setParent(this);
}

на дочернем элементе:

<many-to-one name="parent" not-null="true" column="orderId" foreign-key="FK_order_to_item" />

private Order parent;

void setParent(Order order) {
    this.parent = order;
}

Добавление элементов через Order # addItem (Item).Элемент управляет отношениями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...