第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

spring-data-jpa多對多雙向關(guān)聯(lián),查詢的時候進入死循環(huán)

spring-data-jpa多對多雙向關(guān)聯(lián),查詢的時候進入死循環(huán)

qq__4787 2017-10-20 00:11:48
兩個實體類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 反對 回復(fù) 2017-11-01
  • qq__4787
    qq__4787
    非常感謝!原來一直是因為toString()方法中循環(huán)調(diào)用引發(fā)的問題,之前我也嘗試著將重寫toString()方法,避免循環(huán)調(diào)用。結(jié)果發(fā)現(xiàn)并沒有效果,原來是使用lombok中的@Data注解后會覆蓋掉原來的toString()方法,導(dǎo)致自定義的toString()方法并未生效??磥硪院鬁y試中也的看情況的使用toString()方法了。。。
  • 特南克斯
    特南克斯
    這個問題也困擾了我一段時間,但是到現(xiàn)在我也沒有完美的解決方法。 我見過一些API后臺是關(guān)聯(lián)深度是可以控制的,類似relation_depth = 0 返回數(shù)據(jù)不包含子對象,也就是沒有user.roles。relation_depth = 1 返回數(shù)據(jù)有user.roles。但是沒有user.roles.users。還可以更深。因為復(fù)雜的數(shù)據(jù)庫表結(jié)構(gòu)可能不僅僅是一層的多對多。 但是絕大多數(shù)的情況下關(guān)聯(lián)深度為1,一般都可以用了。 至于toString,你只要注意下,不要對象循環(huán)輸出,就不是內(nèi)存溢出了,也是可以用的
  • qq_白天不懂爺?shù)暮赺2
    qq_白天不懂爺?shù)暮赺2
    請問onetoone怎么解決死循環(huán)的問題呢?
點擊展開后面3
  • 1 回答
  • 0 關(guān)注
  • 10195 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號