繁体   English   中英

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

[英]Spring Hibernate: @Transactional is not working in Spring Data JPA despite being configured

在 ManyToMany 关系中使用 Lazy 评估时,我一直收到此错误:

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

我知道使用 Eager fetch 类型会正常工作,但这将是一个令人头疼的问题并且会导致应用程序性能滞后,因此,我必须继续考虑 Lazy fetch 类型。

我读到使用 Spring Data JPA 时,@ @Transactional将初始化惰性关系,但它似乎对我不起作用。

这是我的应用程序的样子:

实体

课程实体

@Entity
@Table(name = "course")
@Transactional
public class Course {


@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;

@Column(name = "course_name")
private String courseName;

@Column(name = "course_description")
private String courseDescription;

@ManyToMany(cascade = {CascadeType.MERGE,CascadeType.DETACH,CascadeType.REFRESH,CascadeType.PERSIST})
@JoinTable(
        name = "course_student",
        joinColumns = @JoinColumn(name = "course_id"),
        inverseJoinColumns = @JoinColumn(name = "student_id") )
private List<Student> students;

学生实体

@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> { }

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>

我可能做错了什么?

对无公共方法使用 @Transactional 需要 aspectj 依赖。 在代码中,相关方法似乎是包私有的。 改为公开应该可以解决问题,我希望。 我遇到了同样的问题,这篇文章对我帮助Spring @Transactional 属性是否适用于私有方法?

我认为你在这里混淆了事情。 当事务已经结束时,当您尝试获取关系时,会弹出LazyInitializationException

您有多种选择:

  1. 访问事务中的关系
  2. 使用 EAGER 获取
  3. 通过FETCH JOIN使用自定义查询
  4. 使用投影

另请阅读我的文章以获取更多详细信息: https : //arnoldgalovics.com/lazyinitializationexception-demystified/ https://arnoldgalovics.com/using-projections-in-your-data-access-layer/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM