java - Hibernate、JPA - 具有两个表的多对多示例

标签 java sql hibernate jpa many-to-many

我尝试使用多对多集合映射,我有两个表: TASK 和 TASKRELATED,每个任务可以有多个相关任务,每个相关任务可以位于多个父任务中。这是我的 sql 图:

enter image description here

这是我的实体:

@Entity
public class Task {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long taskId;

    @ManyToMany
    @JoinTable(name = "taskRelated", joinColumns = { @JoinColumn(name = "relatedTaskId") }, inverseJoinColumns = { @JoinColumn(name = "taskId") })
    private Set<Task> relatedTasks = new HashSet<Task>(0);

}

这是我的存储库:

public interface ITaskRepository extends JpaRepository<Task, Long>, 
    QueryDslPredicateExecutor<Task>{
}

这是我的代码:

Task t = repository.findOne(1L);

这是我在mysql中的数据: 任务表
enter image description here
任务相关表
enter image description here

当我读取任务对象时,出现错误:

    failed to lazily initialize a collection of role: org.Task.relatedTasks, no session or session was closed
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: org.Task.relatedTasks, no session or session was closed
    at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:383)
    at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:375)
    at org.hibernate.collection.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:122)
    at org.hibernate.collection.PersistentSet.size(PersistentSet.java:162)
    at com.github.springtestdbunit.sample.service.UsersServiceTest.testTask(UsersServiceTest.java:63)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83)
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)

请帮忙!

如果是@ManyToMany(fetch=FetchType.EAGER),则会出现如下错误:

 illegal access to loading collection
org.hibernate.LazyInitializationException: illegal access to loading collection
    at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:366)
    at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:111)
    at org.hibernate.collection.PersistentSet.hashCode(PersistentSet.java:434)
    at org.Task.hashCode(Task.java:36)
    at java.util.HashMap.hash(HashMap.java:351)
    at java.util.HashMap.put(HashMap.java:471)
    at java.util.HashSet.add(HashSet.java:217)
    at java.util.AbstractCollection.addAll(AbstractCollection.java:334)
    at org.hibernate.collection.PersistentSet.endRead(PersistentSet.java:352)
    at org.hibernate.engine.loading.CollectionLoadContext.endLoadingCollection(CollectionLoadContext.java:261)
    at org.hibernate.engine.loading.CollectionLoadContext.endLoadingCollections(CollectionLoadContext.java:246)
    at org.hibernate.engine.loading.CollectionLoadContext.endLoadingCollections(CollectionLoadContext.java:219)
    at org.hibernate.loader.Loader.endCollectionLoad(Loader.java:1005)
    at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:993)

最佳答案

无法初始化集合,您是否尝试过在不初始化集合的情况下添加集合?:

@ManyToMany
@JoinTable(name = "taskRelated", joinColumns = { @JoinColumn(name = "relatedTaskId") }, inverseJoinColumns = { @JoinColumn(name = "taskId") })
private Set<Task> relatedTasks;

关于java - Hibernate、JPA - 具有两个表的多对多示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25786815/

相关文章:

mysql - 我可以在 MySQL 中组合两个更新查询以使其更快吗?

c# - 如何在 SELECT TOP 1 上维护 LINQ 延迟执行

java - 鉴别器公式

java - CDI 将服务注入(inject) JPA 托管实体

Java 球对象不会像预期的那样从绘制的矩形反弹。

java - 在单元格编辑器中调用操作后单元格不会更新

java - 不能在 Java 中使用 Scala 类

java - 如何在 Oracle ATG 中使用 Java API 存储库添加 LIST 项?

java - 使用 SP 克隆数据库记录的最佳方法

java - Criteria API JPA 2 - JOIN 导致 MySQLSyntaxErrorException : You have an error in your SQL syntax