yuxh
yuxh

Reputation: 954

spring data jpa getOne throw LazyInitializationException and findBy not

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?

Upvotes: 14

Views: 6265

Answers (1)

Robert Niestroj
Robert Niestroj

Reputation: 16131

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 .

Upvotes: 23

Related Questions