spring data jpa getOne throw LazyInitializationExc

2020-03-18 06:48发布

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;
..}

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?

1条回答
【Aperson】
2楼-- · 2020-03-18 07:46

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 .

查看更多
登录 后发表回答