在 CrudRepository 中使用连接时出现 LazyInitializationException
LazyInitializationException when using join in CrudRepository
获取 org.hibernate.LazyInitializationException: 无法初始化代理 - 无会话
当我打电话给 findByUserEmail(String email)
服务class(我调用这个函数的地方)被标记为@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
}
User_images
@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
}
___UPDATE___
UserImageRepository
有无实现,直接从方法名自动生成查询。 docs
我不想使用预先加载作为一种不好的做法。
每当您看到类似 org.hibernate.LazyInitializationException: could not initialize proxy - no Session
的内容时,那是因为您正在尝试访问事务边界外的延迟加载 属性。
在某些情况下,这是因为您没有正确设置事务管理器等,因此一旦您从存储库中获取实体,就已经没有活动会话了。
在大多数情况下,您正试图在您声明事务性的地方之外访问延迟加载 属性。例如,可能有一个 Controller 调用你的 Service(你的 Service 是声明事务边界的地方),而在 Controller 中你正在做类似 user.getImages()
的事情。您应该确保在从服务 return 之前已经获取了图像。 (还有一些其他方法,例如 "Open Session In View" 但这绝不是我的首选解决方案)。
这种惰性 属性 访问可能不是显式的,例如,它可能由您调用 User
的 toString()
触发,因为日志记录,或者您正在使用用于检查 User
.
内容的调试器
题外话建议:确保您遵守 Java 的命名约定。它应该是 UserImage
而不是 User_images
获取 org.hibernate.LazyInitializationException: 无法初始化代理 - 无会话 当我打电话给 findByUserEmail(String email)
服务class(我调用这个函数的地方)被标记为@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
}
User_images
@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
}
___UPDATE___
UserImageRepository
有无实现,直接从方法名自动生成查询。 docs
我不想使用预先加载作为一种不好的做法。
每当您看到类似 org.hibernate.LazyInitializationException: could not initialize proxy - no Session
的内容时,那是因为您正在尝试访问事务边界外的延迟加载 属性。
在某些情况下,这是因为您没有正确设置事务管理器等,因此一旦您从存储库中获取实体,就已经没有活动会话了。
在大多数情况下,您正试图在您声明事务性的地方之外访问延迟加载 属性。例如,可能有一个 Controller 调用你的 Service(你的 Service 是声明事务边界的地方),而在 Controller 中你正在做类似 user.getImages()
的事情。您应该确保在从服务 return 之前已经获取了图像。 (还有一些其他方法,例如 "Open Session In View" 但这绝不是我的首选解决方案)。
这种惰性 属性 访问可能不是显式的,例如,它可能由您调用 User
的 toString()
触发,因为日志记录,或者您正在使用用于检查 User
.
题外话建议:确保您遵守 Java 的命名约定。它应该是 UserImage
而不是 User_images