В веб-приложении, которое создает Bill for SaleOrder для Покупателя, я попытался создать таблицы базы данных и сопоставить гибернацию. Отношения между субъектами являются:Каскадное удаление и взаимно однозначное сопоставление в спящем режиме
Законопроект имеет покупателя и SaleOrder
SaleOrder есть покупатель.
Когда объект 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);
благодарит вас за подробный ответ. Однако нас попросят не добавлять Bill_ID в таблицу или класс SaleOrder. Это является причиной всех этих проблем. – jimgardener
Теперь, я понимаю. Тогда вам нужно «закодировать его», вы не можете «настроить его» в 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(); –