spring data jpa getOne 抛出 LazyInitializationException 和 findBy 不
Posted
技术标签:
【中文标题】spring data jpa getOne 抛出 LazyInitializationException 和 findBy 不【英文标题】:spring data jpa getOne throw LazyInitializationException and findBy not 【发布时间】: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://***.com/a/34385219/4652536 中找到了一部分 anwser,但在 findByUserName 中事务如何工作?
【问题讨论】:
是否还要提供用户实体? 我更新了问题,用户名很常见,我不确定与其他领域有什么关系? 你读过方法的javadoc吗?您是否阅读过 EntityManager.getReference(Class, Object) 的 javadoc(在 getOne() 的 javadoc 的“另见”中)?它说什么? 【参考方案1】:getOne
为您提供参考,但不是实际实体。获取一个不会从数据库中获取对象。它只是使用您指定的 ID 创建一个对象。
如果您想要数据库中的实体,请使用 findById
。
【讨论】:
我认为 getOne 会关注 L1Cache。以上是关于spring data jpa getOne 抛出 LazyInitializationException 和 findBy 不的主要内容,如果未能解决你的问题,请参考以下文章
当使用getOne和findOne方法时,Spring Data JPA
Spring Data JPA使用getOne方法报错:Method threw 'org.hibernate.LazyInitializationException' excepti
spring data jpa使用repository进行查询,使用userRepository.getOne(id)和userRepository.findById(id)无法从数据库查询到数据
Spring data jpa 在非常具体的场景中抛出 TransientObjectException
使用 spring-data-jpa 和完整的 tomcat-jdbc 配置的 spring boot 为 ResetAbandonedTimer 抛出 java.lang.ClassNotFound
spring boot:JPA org.hibernate.LazyInitializationException: could not initialize proxy [XXX#1] - n(代码