Каскадное удаление и сопоставление «один к одному» в спящем режиме - PullRequest
0 голосов
/ 22 июля 2011

В веб-приложении, которое создает для покупателя Билл для SaleOrder, я пытался создать таблицы базы данных и отображения гибернации. Отношения между сущностями:

  1. У Билла есть Покупатель и Заказ на продажу

  2. У SaleOrder есть Покупатель.

  3. При удалении SaleOrder соответствующий счет должен быть удален.

Я реализовал Java-классы, создал таблицы.

В схеме таблица SALEORDER имеет столбец FK 'BUYER_ID'. Эта таблица не имеет других столбцов внешнего ключа. Таблица BILL имеет два внешних ключа: BUYER_ID и SALEORDER_ID.

Как сопоставить Билл и SaleOrder, используя отношение один к одному И , чтобы убедиться, что при удалении SaleOrder Билл также удаляется?

Я в замешательстве, потому что, , поскольку в таблице SaleOrder нет внешнего ключа с именем INVOICE_ID, как я могу отобразить следующее в SaleOrder.hbm.xml?

<!-- 1-to-1 modelled using n-to-n + unique  -->
    <many-to-one name="invoice" class="Invoice" column="INVOICE_ID" cascade="delete" unique="true">
    </many-to-one>

Если я добавлю сопоставление только в Bill.hbm.xml, смогу ли я упомянуть каскадное удаление (что должно удалить Билл при удалении SaleOrder)?

Надеюсь, кто-то может предложить решение.


Классы в моем приложении:

class Buyer{
   private Long buyerId;
   private String name;
...
}

class SaleOrder{
    private Long saleOrderId;
    ...
    private Buyer buyer;
...
}

class Bill{
   private Long billId;
   ...
   private Buyer buyer;
   private SaleOrder saleOrder;
...
}

Схема:

CREATE TABLE BUYER(
   BUYER_ID BIGINT NOT NULL PRIMARY KEY IDENTITY,
   NAME VARCHAR(100)
);

CREATE TABLE SALEORDER(
   SALEORDER_ID BIGINT NOT NULL PRIMARY KEY IDENTITY,
   BUYER_ID BIGINT NOT NULL,
);

CREATE TABLE BILL(
  BILL_ID BIGINT NOT NULL PRIMARY KEY IDENTITY,
  BUYER_ID BIGINT NOT NULL,
  SALEORDER_ID BIGINT NOT NULL,
);
ALTER TABLE SALEORDER ADD CONSTRAINT FK_SO_BUYER FOREIGN KEY(BUYER_ID) REFERENCES BUYER(BUYER_ID);
ALTER TABLE BILL ADD CONSTRAINT FK_BILL_BUYER FOREIGN KEY(BUYER_ID) REFERENCES BUYER(BUYER_ID);
ALTER TABLE BILL ADD CONSTRAINT FK_BILL_SO FOREIGN KEY(SALEORDER_ID) REFERENCES SALEORDER(SALEORDER_ID);

1 Ответ

1 голос
/ 22 июля 2011

Позвольте мне ответить на ваши вопросы, используя аннотации, конфигурация XML кажется мне немного старомодной.Решение состоит в том, чтобы не иметь ссылок в Билле.Но SaleOrder будет содержать 1-1 ссылку на Билла и Покупателя 1-n ссылку на SaleOrder, используя CascadeType.DELETE_ORPHAN над определениями отношений.Таким образом, когда SaleOrder удаляется, базовый счет удаляется, а когда покупатель удаляется, основной SaleOrder и его базовые счета удаляются.

class Bill{
    private Long billId;    
    ...    
}

class SaleOrder{    
    private Long saleOrderId;     
    ...     
    @OneToOne(cascade=CascadeType.ALL, fetch=FetchType.LAZY)
    @Cascade( {org.hibernate.annotations.CascadeType.DELETE_ORPHAN} )
    private Bill bill; 
    ... 
}

class Buyer {
    private Long buyerId;
    private String name;
    ...     
    @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY)
    @Cascade( {org.hibernate.annotations.CascadeType.DELETE_ORPHAN} )
    private List<SaleOrder> saleOrders; 
    ... 
}   

Вы должны кодировать свои DAOs получить Покупателя для SaleOrder и SaleOrder для счета.Это конечно другой вопрос, как это сделать.Но вы должны найти хорошие книги и веб-ресурсы на нем.

...