我正在設計一個產品目錄。我想有一個分類樹,其中產品只能連接到葉子分類,可以有一個父母類別。 我正在使用Spring Boot,Spring Data和Hibernate 4和H2數據庫(現在)。該任務如何在java中設計JPA多態關係?
基礎機構是AbstractCategory(難道還有更好的方式來繼承關係?)(getter和setter省略,NamedEntity是@MappedSuperclass與字符串名稱和長ID)
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>
你分享你的配置 –