Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.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 Spring Hibernate:@Transactional在Spring Data JPA中不工作,尽管已配置_Java_Spring_Hibernate_Spring Mvc_Spring Data Jpa - Fatal编程技术网

Java Spring Hibernate:@Transactional在Spring Data JPA中不工作,尽管已配置

Java Spring Hibernate:@Transactional在Spring Data JPA中不工作,尽管已配置,java,spring,hibernate,spring-mvc,spring-data-jpa,Java,Spring,Hibernate,Spring Mvc,Spring Data Jpa,在多人关系中使用惰性评估时,我一直收到此错误: LazyInitializationException:延迟初始化角色集合失败,无法初始化代理-无会话 我知道使用Eager-fetch类型可以很好地工作,但这将是一个令人头痛的问题,并且会给应用程序带来性能滞后,因此,我必须继续考虑Lazy-fetch类型 我读到当使用Spring数据JPA时,@Transactional将初始化惰性关系,但它似乎对我无效 以下是我的应用程序的外观: 实体 课程实体 } 存储库 课程库 @存储库 公共接口Cour

在多人关系中使用惰性评估时,我一直收到此错误:

LazyInitializationException:延迟初始化角色集合失败,无法初始化代理-无会话

我知道使用Eager-fetch类型可以很好地工作,但这将是一个令人头痛的问题,并且会给应用程序带来性能滞后,因此,我必须继续考虑Lazy-fetch类型

我读到当使用Spring数据JPA时,
@Transactional
将初始化惰性关系,但它似乎对我无效

以下是我的应用程序的外观:

实体

课程实体

}

存储库

课程库

@存储库
公共接口CourseRepo扩展了JpaRepository{}
学生存储库

@存储库
公共接口StudentRepo扩展了JpaRepository{}
Servlet配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"  ....    >

<context:annotation-config/>

<context:component-scan base-package="com.company.springdemo"/>

<mvc:annotation-driven/>

....

<jpa:repositories transaction-manager-ref="transactionManagerJPA" base-package="com.company.springdemo" entity-manager-factory-ref="EMF" />

<bean id="transactionManagerJPA" class="org.springframework.orm.jpa.JpaTransactionManager" >
    <property name="dataSource" ref="myDataSource" />
</bean>

<tx:annotation-driven transaction-manager="transactionManagerJPA" />


<bean id="EMF"
      class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="packagesToScan" value="com.company.springdemo.entity" />
    <property name="dataSource" ref="myDataSource" />

    <property name="jpaProperties">
        <props>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQL57Dialect</prop>
            <prop key="hibernate.show_sql">false</prop>
            <prop key="hibernate.format_sql">true</prop>
        </props>
    </property>

    <property name="persistenceProvider">
        <bean class="org.hibernate.jpa.HibernatePersistenceProvider" />
    </property>
</bean>

....
符合事实的
使现代化
org.hibernate.dialogue.mysql57dialogue
错误的
符合事实的


我可能做错了什么?

我想你把事情搞混了<代码>LazyInitializationException在事务已结束时尝试获取关系时弹出

您有多种选择:

  • 访问事务中的关系
  • 使用即时抓取
  • 使用带有
    FETCH JOIN
  • 使用投影
  • 请阅读我的文章以了解更多详细信息:
    使用@Transactional for none公共方法需要aspectj依赖关系。在代码中,相关方法似乎是包私有的。我希望,向公众开放应该能解决这个问题。我也有同样的问题,这篇文章帮助了我

    谢谢你的回答。是的,我知道这个异常正在出现,因为我们在事务失效时访问关系,所以,我的问题仍然存在:我想初始化惰性实体,而不急于获取它们,使用fetch join,也不使用projections换句话说,我希望您能详细说明您的第一个建议,即使用问题中分类的Spring数据JPA接口。再次感谢!另外,如果可能的话,@Transactional annotation如何解决这个问题?如果我配置错误,您的控制器被标记为
    @Transactional
    ,所以它应该可以工作。您使用的是哪个Spring版本?您是从Spring还是从JavaEE导入了
    @Transactional
    注释?我使用Spring 5.0.5…是的,@Transactional注释已经导入,如下所示:
    import javax.transaction.Transactional能否指定导致问题的确切代码行?调用此行时,错误发生在for循环内部
    course.getStudents()
    Ok。你能提供控制器的完整源代码吗?在控制器代码里面。。。谢谢@PiotrPodraza,我现在就更新
    @Entity
    @Table(name = "students")
    public class Student {
    
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    
    private String name;
    
    private String grade;
    
    @ManyToMany(cascade = {CascadeType.MERGE,CascadeType.DETACH,CascadeType.REFRESH,CascadeType.PERSIST},fetch = FetchType.EAGER)
    @JoinTable(
            name = "course_student",
            joinColumns = @JoinColumn(name = "student_id"),
            inverseJoinColumns = @JoinColumn(name = "course_id") )
    List<Course> courses;
    
    @Controller
    @RequestMapping("/courses")
    @Transactional
    public class CourseController {
    
    ....
    
    @GetMapping("get-joined-students")
    ModelAndView getJoined() {
    
        Course course = courseRepo.findById(6).get();
    
        for (Student student :
                course.getStudents()) {
    
            System.out.println("Student: " + student);
        }
    
    
        ModelAndView modelAndView = new ModelAndView("redirect:list");
    
        return modelAndView;
    }
    
    @Repository
    public interface CourseRepo extends JpaRepository<Course,Integer> {}
    
    @Repository
    public interface StudentRepo extends JpaRepository<Student,Integer> { }
    
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"  ....    >
    
    <context:annotation-config/>
    
    <context:component-scan base-package="com.company.springdemo"/>
    
    <mvc:annotation-driven/>
    
    ....
    
    <jpa:repositories transaction-manager-ref="transactionManagerJPA" base-package="com.company.springdemo" entity-manager-factory-ref="EMF" />
    
    <bean id="transactionManagerJPA" class="org.springframework.orm.jpa.JpaTransactionManager" >
        <property name="dataSource" ref="myDataSource" />
    </bean>
    
    <tx:annotation-driven transaction-manager="transactionManagerJPA" />
    
    
    <bean id="EMF"
          class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="packagesToScan" value="com.company.springdemo.entity" />
        <property name="dataSource" ref="myDataSource" />
    
        <property name="jpaProperties">
            <props>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQL57Dialect</prop>
                <prop key="hibernate.show_sql">false</prop>
                <prop key="hibernate.format_sql">true</prop>
            </props>
        </property>
    
        <property name="persistenceProvider">
            <bean class="org.hibernate.jpa.HibernatePersistenceProvider" />
        </property>
    </bean>