春季数据JPA getOne抛出LazyInitializationException和findBy不 [英] spring data jpa getOne throw LazyInitializationException and findBy not

查看:187
本文介绍了春季数据JPA getOne抛出LazyInitializationException和findBy不的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用spring数据jpa,这是我的示例:

I use spring data jpa ,here is my sample:

public interface UserRepository extends JpaRepository<User, Long> {

    User findByUserName(String userName);
....}

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserRepositoryTests {

    @Autowired
    private UserRepository userRepository;
    @Test
    public void test1(){
        String name = userRepository.getOne(3L).getUserName();
    }

}
@Entity
public class User extends Entitys implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue
    private Integer id;
    @Column(nullable = false, unique = true)
    private String userName;
..}

test1将抛出"LazyInitializationException:无法初始化代理-没有会话",但是如果我使用userRepository.findByUserName("aa").getUserName()可以.尽管可以通过添加@Transactional来解决问题,但我想知道其区别和原因. 我在 https://stackoverflow.com/a/34385219/4652536 中找到了anwser的一部分,但是在findByUserName中事务如何工作?

the test1 will throw "LazyInitializationException: could not initialize proxy - no Session",but if I use userRepository.findByUserName("aa").getUserName() will ok. Although the problem can be solved by add @Transactional, I want to know the difference and the reason behind this.
I find part of anwser in https://stackoverflow.com/a/34385219/4652536, but how transactional work in findByUserName?

推荐答案

getOne gets you a reference, but not the actual entity. Get one does noe fetch the object from the DB. It just creates an object with the ID you specified.

如果要从数据库中使用实体,请使用

If you want the entity from the DB use findById .

这篇关于春季数据JPA getOne抛出LazyInitializationException和findBy不的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆