兩個實體類User@Data
@Entity
@Table(name?=?"sys_user")
public?class?User?{
????@Id
????@GeneratedValue
????@Column(name?=?"user_id")
????private?Integer?userId;
????@Column(name?=?"username")
????private?String?username;
????@ManyToMany(cascade?=?{CascadeType.ALL},?fetch?=?FetchType.LAZY)
????@JoinTable(
????????????name?=?"user_role",
????????????joinColumns?=?{@JoinColumn(name?=?"user_id")},
????????????inverseJoinColumns?=?{@JoinColumn(name?=?"role_id")}
????)
????private?Set<Role>?roles;
}Role@Data
@Entity
@Table(name?=?"sys_role")
public?class?Role?{
????@Id
????@Column(name?=?"role_id")
????private?Integer?roleId;
????@Column(name?=?"role_name",?unique?=?true)
????private?String?roleName;
????@ManyToMany(cascade?=?{CascadeType.ALL},?fetch?=?FetchType.LAZY,?mappedBy?=?"roles")
????private?Set<User>?users;測試代碼@Transactional
????@Test
????public?void?save()?throws?Exception{
????????Set<Role>roles?=?new?HashSet<Role>();
????????roles.add(new?Role(1,?"USER"));
????????roles.add(new?Role(2,?"ADMIN"));
????????repository.save(new?User("張三",?roles));
????}
????@Transactional
????@Test
????public?void?findAll(){
????????List<User>?users?=?repository.findAll();
????????for?(User?user?:?users)?{
????????????System.out.println(user);
????????}
????}在使用插入數(shù)據(jù)的時候沒有任何問題,但是當(dāng)查詢的時候報錯org.hibernate.LazyInitializationException:?failed?to?lazily?initialize?a?collection?of?role:?wang.xiaoqiang.manytomany.entity.User.roles,?could?not?initialize?proxy?-?no?Session這個可以理解,懶加載的時候丟失了session無法獲取roles信息,當(dāng)將user中的集合設(shè)置為急加載模式,結(jié)果就遇到StackOverflowError哪位大佬有相關(guān)經(jīng)歷,幫幫忙。。。
1 回答
已采納

特南克斯
TA貢獻14條經(jīng)驗 獲得超9個贊
首先你要理解這是雙向關(guān)聯(lián),雙向關(guān)聯(lián)中你如果從數(shù)據(jù)庫里面查詢一個User對象,那么User對象里面有Role,Role里面又有User對象,那么你用syso輸出User對象,如果toString方法里面包含有輸出User.roles的話,那么是必然會造成死循環(huán)的。如果你用sping mvc等框架將后臺數(shù)據(jù)返回給前臺也是同理,也會造成返回的JSON數(shù)據(jù)死循環(huán)
那么要如何解決?
解決辦法就是在序列化實例的時候中斷循環(huán)就好。首先你要理解這不是spring-data-jpa的問題,這是一個序列化的問題。
例如如果是用jsckson對數(shù)據(jù)進行序列化的的話,可以使用下面的注解。
import?com.fasterxml.jackson.annotation.JsonIgnoreProperties; @Data @Entity @Table(name?=?"sys_user") public?class?User?{ ????@Id ????@GeneratedValue ????@Column(name?=?"user_id") ????private?Integer?userId; ????@Column(name?=?"username") ????private?String?username; ????@JsonIgnoreProperties(value?=?{?"users"?}) ????@ManyToMany(cascade?=?{CascadeType.ALL},?fetch?=?FetchType.LAZY) ????@JoinTable( ????????????name?=?"user_role", ????????????joinColumns?=?{@JoinColumn(name?=?"user_id")}, ????????????inverseJoinColumns?=?{@JoinColumn(name?=?"role_id")} ????) ????private?Set<Role>?roles; }
這樣的話,你再序列化User對象時,
user.roles 這個對象中只有 user.roles[i].id 和? users.roles[i].name 而沒有 user.roles.users?。。。?/p>
ok,問題解決?。?!
點擊展開后面3條
添加回答
舉報
0/150
提交
取消