【问题标题】:spring data jpa getOne throw LazyInitializationException and findBy notspring data jpa getOne 抛出 LazyInitializationException 和 findBy 不
【发布时间】:2018-08-11 07:41:40
【问题描述】:

我使用 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:无法初始化代理 - 无会话”,但如果我使用 userRepository.findByUserName("aa").getUserName() 就可以了。虽然可以通过添加@Transactional来解决问题,但我想知道这其中的区别和原因。
我在 https://stackoverflow.com/a/34385219/4652536 中找到了一部分 anwser,但在 findByUserName 中事务如何工作?

【问题讨论】:

  • 是否还要提供用户实体?
  • 我更新了问题,用户名很常见,我不确定与其他领域有什么关系?
  • 你读过方法的javadoc吗?您是否阅读过 EntityManager.getReference(Class, Object) 的 javadoc(在 getOne() 的 javadoc 的“另见”中)?它说什么?

标签: java hibernate spring-data-jpa


【解决方案1】:

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

如果您想要数据库中的实体,请使用 findById

【讨论】:

  • 我认为 getOne 会关注 L1Cache。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-25
  • 2015-07-31
  • 2014-05-22
  • 1970-01-01
  • 2015-11-22
相关资源
最近更新 更多