2011-07-22 1 views
0

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

  1. Законопроект имеет покупателя и SaleOrder

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

  3. Когда объект SaleOrder удален, связанный с ним счет должен быть удален.

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

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

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

Я смущен, потому что, , так как таблица SalesOrder не имеет внешнего ключа с именем 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

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

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; 
    ... 
} 

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

+0

благодарит вас за подробный ответ. Однако нас попросят не добавлять Bill_ID в таблицу или класс SaleOrder. Это является причиной всех этих проблем. – jimgardener

+1

Теперь, я понимаю. Тогда вам нужно «закодировать его», вы не можете «настроить его» в XML, я думаю. Каскадное удаление работает, как описано выше.То, о чем вы просите, может быть вызвано «удалением экземпляра» или «ссылкой delete», которое не является частью JPA или Hibernate. Вот фрагмент кода с использованием HQL: Session session = (Session) entityManager.getDelegate(); // Удалить запись в билде со ссылкой SaleOrder Запрос запроса = session.createQuery ("delete Bill where saleOrder_id =: saleOrder_id"); query.setParameter ("saleOrder_id", saleOrder_id) .executeUpdate(); –