在CrudRepository

时间:2015-05-25 11:31:01

标签: java hibernate spring-mvc jpa lazy-initialization

获取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

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

1 个答案:

答案 0 :(得分:1)

每当您看到类似org.hibernate.LazyInitializationException: could not initialize proxy - no Session的内容时,都是因为您正在尝试访问事务边界外的延迟加载属性。

在某些情况下,这是因为您还没有正确设置事务管理器等,因此一旦从存储库中获取实体,就没有活动的会话。

在大多数情况下,您尝试在声明事务的位置之外访问延迟加载属性。例如,可能有一个Controller调用您的服务(您的服务是声明事务边界的地方),而在控制器中您正在执行类似user.getImages()的操作。从服务返回之前,您应该确保已经提取了图像。 (还有其他一些方法,比如&#34; Open Session In View&#34;但这绝不是我首选的解决方案。)

这种延迟属性访问可能不明确,例如,由于日志记录,您可能会因toString() User而触发,或者您正在使用调试器来检查内容User

非主题建议:确保在命名时遵守Java的约定。它应该是UserImage而不是User_images