Я разрабатываю каталог продукции. Я хотел бы иметь дерево категорий, где продукты могут быть подключены только к LeafCategories, которые могут иметь одного родителя Категория. Я использую Spring Boot, Spring Data и Hibernate 4 и базу данных H2 (пока).Как создать полиморфные отношения JPA в java?
Базовый объект для выполнения этой задачи является AbstractCategory (Является ли это есть лучший способ, чтобы наследовать отношения?) (Геттеры и сеттеры опущенные, NamedEntity является @MappedSuperclass с именем Струнный и Лонг-ид)
public abstract class AbstractCategory extends NamedEntity{
@ManyToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name = "parentId")
Category parent;
}
Категория лица - они не являются листья и не могут быть продукты связаны с ними:
@Entity
public class Category extends AbstractCategory {
@OneToMany(cascade = CascadeType.ALL, mappedBy = "parent")
Collection<AbstractCategory> subcategories;
}
LeafCategory его можно использовать как свойство для моего Продукт объект.
@Entity
public class LeafCategory extends AbstractCategory {
@OneToMany(cascade = CascadeType.PERSIST, mappedBy = "category")
Collection<Product> products;
}
У меня есть очень простой CrudRepository для Категории и идентичного для LeafCategory
@Repository
@Transactional
public interface CategoryRepository extends CrudRepository<Category, Long> {}
Когда я загружаю категорию из CategoryRepository и getSubcategories доступа() я получаю следующее исключение:
Caused by: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: uj.jg.domain.products.Category.subcategories, could not initialize proxy - no Session
Прежде всего - как улучшить дизайн? Второй и более конкретный вопрос - почему @Transactional
не удерживает сессию открытой? Я знаю, что могу просто использовать FetchType.EAGER
, но это рекурсивная структура - если мое понимание Hibernate правильно, это означало бы загрузку всего поддерева, и я не хочу этого. Я тоже не хочу использовать Hibernate.initialize
.
У меня нет никакой конфигурации для базы данных или спящего режима. Я использую DevTools из spring.boot:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
ли вы поделиться конфигурациями –