Spring Data JPA中的getOne方法抛出LazyInitializationException异常,而findBy方法则没有。

14

我使用Spring Data 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: could not initialize proxy - no Session"的异常,但如果我使用userRepository.findByUserName("aa").getUserName()就不会。虽然可以通过添加@Transactional来解决问题,但我想知道这两种方式的区别和原因。
我在https://dev59.com/N5Lea4cB1Zd3GeqPz0Pr#34385219中找到了部分答案,但是@Transactional在findByUserName中是如何起作用的?


您是否也提供用户实体? - Sepehr GH
我更新了问题,userName是通用的,我不确定与其他字段有关的任何内容。 - yuxh
你有没有阅读方法的javadoc?你有没有阅读过EntityManager.getReference(Class, Object) 的javadoc(它在getOne()的“另请参阅”部分中)?它说了什么? - JB Nizet
1个回答

23

getOne方法将获取一个实体的引用,而非实际实体。getOne不会从数据库中提取对象,它只是创建一个带有指定ID的对象。

如果您想要从数据库中获取实体,请使用findById方法。


我认为getOne查看L1缓存。 - Anand Vaidya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接