spring data jpa getOne throw LazyInitializationException and findBy not

2022-09-04 01:16:16

我使用弹簧数据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: 无法初始化 proxy - no Session”,但是如果我使用 userRepository.findByUserName(“aa”).getUserName() 会 ok。虽然可以通过添加@Transactional来解决问题,但我想知道其区别以及背后的原因。
我在 https://stackoverflow.com/a/34385219/4652536 中找到了 anwser 的一部分,但是在 findByUserName 中如何进行事务性工作?


答案 1

getOne 会给你一个引用,但不是实际的实体。获取一个不会从数据库获取对象。它只是使用您指定的 ID 创建一个对象。

如果要从 DB 中获取实体,请使用 findById


答案 2

推荐