gpt4 book ai didi

java - 在 CrudRepository 中使用 join 时出现 LazyInitializationException

转载 作者:行者123 更新时间:2023-11-30 08:10:37 26 4
gpt4 key购买 nike

获取 org.hibernate.LazyInitializationException:无法初始化代理 - 无 session 当我调用 findByUserEmail(String email)

服务类(我在其中调用此函数)被标记为@Transactional

存储库

@Repository
public interface UserImagesRepository extends CrudRepository<User_images, Integer> {
List<User_images> findByUserEmail(String email);
}

用户

@Entity
@Table(name = "users")
@NamedQuery(name = "User.findAll", query = "SELECT u FROM User u")
public class User implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;

private String email;

@OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
private Set<User_images> images = new HashSet<User_images>(0);

//getters and setters
}

用户图像

@Entity
@Table(name = "user_images")
public class User_images implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "userId")
private User user;

// getters and setters
}

___更新___

UserImageRepository 没有实现,查询是直接从方法名称自动生成的。 docs

我不想使用急切加载作为其不好的做法。

最佳答案

每当您看到类似org.hibernate.LazyInitializationException:无法初始化代理 - 无 session 之类的内容时,这是因为您正在尝试访问事务边界之外的延迟加载属性。

在某些情况下,这是因为您没有正确设置事务管理器等,因此一旦您从存储库中获取实体,就已经没有 Activity session 了。

在大多数情况下,您尝试在声明事务性之外访问延迟加载属性。例如,可能有一个 Controller 调用您的服务(您的服务是声明事务边界的地方),并且在 Controller 中您正在执行类似 user.getImages() 的操作。您应该确保在从服务返回之前已经获取了图像。 (还有一些其他方法,例如“在 View 中打开 session ”,但这从来都不是我的首选解决方案)。

这种惰性属性访问可能不是显式的,例如,它可能是由您因日志记录而调用 UsertoString() 触发的,或者您正在使用调试器来检查 User 的内容。

题外话建议:确保您遵守 Java 的命名约定。它应该是 UserImage 而不是 User_images

关于java - 在 CrudRepository 中使用 join 时出现 LazyInitializationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30437375/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com