春季数据JPA getOne抛出LazyInitializationException和findBy不 [英] spring data jpa getOne throw LazyInitializationException and findBy not
问题描述
我使用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屋!