获取org.hibernate.LazyInitializationException:无法初始化代理-没有会话
当我打电话给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
}
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
的内容时,都是因为您尝试访问事务边界之外的延迟加载属性。
在某些情况下,这是因为您没有正确设置事务管理器等,因此一旦从存储库中获取实体,就已经没有活动的Session。
在大多数情况下,您尝试在声明为事务性的位置之外访问延迟加载属性。例如,可能有一个控制器调用您的服务(您的服务是在其中声明事务边界的位置),并且在控制器中您正在执行类似user.getImages()
的操作。从服务返回之前,应确保已获取图像。 (还有其他一些方法,例如“在视图中打开会话”,但这从来不是我的首选解决方案)。
此类惰性属性访问可能不是显式的,例如,可能是由于您由于日志记录而调用toString()
的User
或使用调试器检查User
的内容而触发的。
建议:确保您在命名时遵守Java的约定。它应该是UserImage
而不是User_images