Спящий модельный вопрос - PullRequest
       1

Спящий модельный вопрос

0 голосов
/ 11 февраля 2011

Я не могу решить это так, как хочу в Hibernate.Вот оно: у меня есть продукт, у каждого продукта есть свои поля и так далее.Каждый продукт может быть либо продуктом верхнего уровня, либо вторичным продуктом.Вторичный продукт будет связан с продуктом верхнего уровня, продукт верхнего уровня будет связан ни с чем.Когда я запрашиваю продукт из базы данных, я хотел бы знать, является ли он TopLevel или нет.Список связанных вторичных продуктов можно получить позже (или даже раньше, но это не так необходимо).

Я думал об использовании этого bean-компонента:

public class Product{

 ...properties..

 Product topLevelProduct;

...getters and setters...

}

Проблема в том, что если я сопоставлю свойство topLevelProduct как многие-к-одному, у меня возникнут проблемы с удалением продуктов верхнего уровня.На самом деле, если с ними связаны вторичные продукты, я получаю:

java.sql.BatchUpdateException: Cannot delete or update a parent row: a foreign key constraint fails (`jacciseweb`.`prodotti`, CONSTRAINT `FKC803BB11ACD3B812` FOREIGN KEY (`prodottoDiRiferimento_ID`) REFERENCES `prodotti` (`ID`))

. Я ожидаю, что если я удалю TopLevelProduct, будет также удален secondLevelProducts.Должен ли я использовать другую структуру?Может быть, с использованием двух бобов, полученных из одного и того же?Или поменять отношения следующим образом:

public class Product{

 ...properties..

 List<Product> secondLevelProducts = new ArrayList<Product>();

...getters and setters...

}

В любом случае это вызывает у меня проблему: мне нужно использовать другой запрос, чтобы узнать, является ли продукт вторичным или нет, потому что просто зная, что у него нет никакого вторичного продукта,это не значит, что он вторичен, это может быть даже продукт высшего уровня, у которого нет продуктов второго уровня.

Идеи?

Ответы [ 2 ]

1 голос
/ 11 февраля 2011

Помимо ответа Марко, если вы решили применить каскадное удаление при удалении продукта верхнего уровня, у вас есть два варианта:

  • Если различие между продуктами верхнего уровня и вторичными продуктами стабильно, то есть продукт верхнего уровня никогда не превратится в вторичный продукт, и наоборот, вы можете смоделировать его как иерархию наследования с отношением один ко многим между TopLevelProduct и SecondaryProduct (эта связь может быть как однонаправленной, так и двунаправленной, если вам нужен дочерний родительский продукт).

  • В противном случае вы можете решить свою проблему, создав двунаправленную связь между Product с, что-то вроде этого:

    public class Product {
        @ManyToOne
        private Product topLevelProduct; // Is null for top level products
    
        // Applies cascading
        @OneToMany(mappedBy = "topLevelProduct", cascade = CascadeType.REMOVE)
        private List<Product> secondaryProducts;
    
        ...
    }
    
1 голос
/ 11 февраля 2011

Я мало что знаю о спящем режиме, но проблема здесь кажется мне довольно простой.Вы не можете удалять продукты верхнего уровня, когда на них ссылается продукт второго уровня.

Решение состоит в том, чтобы определить, что должно произойти с продуктом второго уровня, если вы удалите верхний уровень.Вы можете каскадировать операцию (все продукты второго уровня будут удалены).Или продукты второго уровня становятся продуктами высшего уровня.В спящем режиме должен быть способ определить желаемое поведение в ассоциации.Поищите в документации что-то вроде «каскадного удаления».

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