簡體   English   中英

在CrudRepository中使用連接時出現LazyInitializationException

[英]LazyInitializationException when using join in CrudRepository

獲取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 沒有實現,查詢直接從方法名稱自動生成。 文檔

我不想將急切加載作為壞習慣。

每當您看到諸如org.hibernate.LazyInitializationException: could not initialize proxy - no Session ,這是因為您嘗試訪問事務邊界之外的延遲加載屬性。

在某些情況下,這是因為您沒有正確設置事務管理器等,因此一旦從存儲庫中獲取實體,就已經沒有活動的Session。

在大多數情況下,您嘗試在聲明為事務性的位置之外訪問延遲加載屬性。 例如,可能有一個Controller調用您的Service(您的Service是在其中聲明事務邊界的位置),並且在該Controller中,您正在執行類似user.getImages() 從服務返回之前,應確保已獲取圖像。 (還有其他一些方法,例如“在視圖中打開會話”,但這從來不是我的首選解決方案)。

這類惰性屬性訪問可能不是顯式的,例如,可能是由於您由於日志記錄而調用User toString()或您使用調試器檢查User的內容而觸發的。

建議:確保您在命名時遵守Java的約定。 應該是UserImage而不是User_images

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM