程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何在Spring Data JPA中解决LazyInitializationException?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决如何在Spring Data JPA中解决LazyInitializationException??

开发过程中遇到如何在Spring Data JPA中解决LazyInitializationException?的问题如何解决?下面主要结合日常开发的经验,给出你关于如何在Spring Data JPA中解决LazyInitializationException?的解决方法建议,希望对你解决如何在Spring Data JPA中解决LazyInitializationException?有所启发或帮助;

基本上,你需要在事务内部时获取惰性数据。如果你的服务类别为@transactional,那么你在其中时一切都应该没问题。退出服务类后,如果尝试get延迟集合,你将获得该异常,该异常位于@H_190_3@main()方法line中System.out.println(random.getCreatedJobs());。

现在,归结为你需要返回的服务方法。如果userservice.getRandomUser()期望返回一个初始化了作业的用户,以便你可以对其进行操作,则该方法的责任是取回它。使用Hibernate最简单的方法是调用Hibernate.initialize(user.getCreatedJobs())。

解决方法

我必须参加具有一对多关系的课程。当我尝试访问延迟加载的集合时,出现·。我在网上搜索了一段时间,现在我知道我得到了异常,因为用于加载保存集合的类的会话已关闭。但是我没有找到解决方案(或者至少我不理解它们)。基本上我有那些课:

User

@Entity
@Table(name = "user")
public class User {

    @Id
    @GeneratedValue
    @column(name = "id")
    private long id;

    @OneToMany(mappedBy = "creator")
    private Set<Job> createdJobs = new HashSet<>();

    public long getId() {
        return id;
    }

    public void setId(final long id) {
        this.id = id;
    }

    public Set<Job> getCreatedJobs() {
        return createdJobs;
    }

    public void setCreatedJobs(final Set<Job> createdJobs) {
        this.createdJobs = createdJobs;
    }

}

UserRepository

public interface UserRepository extends JpaRepository<User,Long> {}

Userservice

@service
@transactional
public class Userservice {

    @Autowired
    private UserRepository repository;

    Boolean usersAvailable = false;

    public void addSomeUsers() {
        for (int i = 1; i < 101; i++) {
            final User user = new User();

            repository.save(user);
        }

        usersAvailable = true;
    }

    public User getRandomUser() {
        final Random rand = new Random();

        if (!usersAvailablE) {
            addSomeUsers();
        }

        return repository.findOne(rand.nexTint(100) + 1L);
    }

    public List<User> getAllUsers() {
        return repository.findAll();
    }

}

Job

@Entity
@Table(name = "job")
@Inheritance
@Discriminatorcolumn(name = "job_type",discriminatorType = DiscriminatorType.StriNG)
public abstract class Job {

    @Id
    @GeneratedValue
    @column(name = "id")
    private long id;

    @manyToOne
    @Joincolumn(name = "user_id",nullable = falsE)
    private User creator;

    public long getId() {
        return id;
    }

    public void setId(final long id) {
        this.id = id;
    }

    public User getCreator() {
        return creator;
    }

    public void setCreator(final User creator) {
        this.creator = creator;
    }

}

JobRepository

public interface JobRepository extends JpaRepository<Job,Long> {}

Jobservice

@service
@transactional
public class Jobservice {

    @Autowired
    private JobRepository repository;

    public void addJob(final Job job) {
        repository.save(job);
    }

    public List<Job> getJobs() {
        return repository.findAll();
    }

    public void addJobsForUsers(final List<User> users) {
        final Random rand = new Random();

        for (final User user : users) {
            for (int i = 0; i < 20; i++) {
                switch (rand.nexTint(2)) {
                case 0:
                    addJob(new HelloWorldJob(user));
                    break;
                default:
                    addJob(new GoodbyeWorldJob(user));
                    break;
                }
            }
        }
    }

}

App

@Configuration
@EnableAutoConfiguration
@ComponentScan
public class App {

    public static void main(final String[] args) {
        final ConfigurableApplicationContext context = SpringApplication.run(App.class);
        final Userservice userservice = context.getBean(Userservice.class);
        final Jobservice jobservice = context.getBean(Jobservice.class);

        userservice.addSomeUsers();                                 // Generates some users and stores them in the db
        jobservice.addJobsForUsers(userservice.getAllUsers());      // Generates some jobs for the users

        final User random = userservice.getRandomUser();            // Picks a random user

        System.out.println(random.getCreatedJobs());
    }

}

我经常读到会话必须绑定到当前线程,但是我不知道如何使用Spring的基于注释的配置来做到这一点。有人可以指出我该怎么做吗?

PS我想使用延迟加载,因此急于加载是没有选择的。

大佬总结

以上是大佬教程为你收集整理的如何在Spring Data JPA中解决LazyInitializationException?全部内容,希望文章能够帮你解决如何在Spring Data JPA中解决LazyInitializationException?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。