![](/img/trans.png)
[英]Hibernate LazyInitializationException using Spring CrudRepository
[英]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.