Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate,JPA-示例有两个表的多个_Java_Sql_Hibernate_Jpa_Many To Many - Fatal编程技术网

Java Hibernate,JPA-示例有两个表的多个

Java Hibernate,JPA-示例有两个表的多个,java,sql,hibernate,jpa,many-to-many,Java,Sql,Hibernate,Jpa,Many To Many,我尝试使用多对多集合映射,我有两个表: 任务和任务相关,每个任务可以有多个相关任务,每个相关任务可以在多个父任务中。这是我的sql图表: 这是我的实体: @Entity public class Task { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private Long taskId; @ManyToMany @JoinTable(name = "taskRelated", jo

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

这是我的实体:

@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);

}
这是我在mysql中的数据: 任务表

任务相关表

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

    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)
请帮忙

@manytomy(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;
@manytomy
@JoinTable(name=“taskRelated”,joinColumns={@JoinColumn(name=“relatedTaskId”)},inverseJoinColumns={@JoinColumn(name=“taskId”)})
私有集相关任务;

例外情况是,在关闭会话后,您试图访问集合元素-
相关任务,默认情况下,Hibernate会延迟加载集合元素

因此,您需要访问会话中的元素,或者您可以将获取类型添加到
EAGER

 @ManyToMany(fetch = FetchType.EAGER)
更新:

根据stacktrace for exception-
LazyInitializationException:非法访问加载集合
它有:

at org.hibernate.collection.PersistentSet.hashCode(PersistentSet.java:434)
at org.nli.seoweb.domain.Task.hashCode(Task.java:36)
基于此,我假设您已经覆盖了
任务
实体中的
hashCode
方法,并且此方法正在尝试访问
集合
。由于Hibernate为
集合
提供了一个包装类,在本例中,它是
PersistentSet
,因此在内部调用
hashCode()
会进行验证,检查
集合
是否已完全初始化,然后引发异常

因此,请尝试修改您的
Task.hashCode()
方法,并确保您没有在其中使用
Set
,然后查看它是否解决了问题


对于类似的异常,您也可以参考。

您忘记发布UsersServiceTest.testTask()。你知道,发生异常的地方。我已经可以大胆猜测,在该代码的任何地方实际上都没有启动JPA事务。好的,正如Gimby提到的,请添加导致此问题的代码。@priliam,您还可以为
org.nli.seoweb.domain.Task.hashCode()方法添加代码,这个错误似乎与您的hashcode方法有一定关系。@prilia更新了我的答案,看看是否有帮助
 @ManyToMany(fetch = FetchType.EAGER)
at org.hibernate.collection.PersistentSet.hashCode(PersistentSet.java:434)
at org.nli.seoweb.domain.Task.hashCode(Task.java:36)