spring data jpa getOne抛出LazyInitializationException而findBy没有

问题描述 投票:3回答:1

我使用spring数据jpa,这是我的样本:

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中的事务是如何工作的?

java hibernate spring-data-jpa
1个回答
9
投票

getOne为您提供参考,但不是实际的实体。得到一个没有从数据库中获取对象。它只是使用您指定的ID创建一个对象。

如果您希望数据库中的实体使用findById

© www.soinside.com 2019 - 2024. All rights reserved.