Java Spring Hibernate:@Transactional在Spring Data JPA中不工作,尽管已配置
在多人关系中使用惰性评估时,我一直收到此错误: LazyInitializationException:延迟初始化角色集合失败,无法初始化代理-无会话 我知道使用Eager-fetch类型可以很好地工作,但这将是一个令人头痛的问题,并且会给应用程序带来性能滞后,因此,我必须继续考虑Lazy-fetch类型 我读到当使用Spring数据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
@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>