你好,我的專業人士我有一個簡單的問題,我想乞求解決這個問題..
這是成員的物體
@Entity
@Getter
@Builder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
/*@ToString(of = {"id", "username", "age"})*/
public class Member {
@Id
/*@GeneratedValue(strategy = GenerationType.IDENTITY)*/
@Column(name = "member_id")
private Long id;
private String username;
private int age;
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "member")
private List<Team> teams;
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "member")
private List<Coach> coachs;
}
這是教練的物體
@Entity
@AllArgsConstructor
@Getter
@Builder
@Setter
@NoArgsConstructor
@ToString(of = {"id","name","career"})
public class Coach {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name= "coach_id")
private Long id;
@Column
private String name;
@Column
private String career;
@ManyToOne(fetch = FetchType.LAZY,cascade = ALL)
@JoinColumn(name = "member_id")
private Member member;
@OneToOne(fetch = FetchType.LAZY,cascade = ALL)
@JoinColumn(name = "team_id")
private Team team;
}
這是控制器代碼
@GetMapping("/member")
public void createUser(){
Member m = memberService.createMember();
Coach c = m.getCoachs().get(0);
log.info(c.getName());
}
這是服務代碼
private final MemberRepository memberRepository;
@Transactional
public Member createMember(){
return memberRepository.findMemberById(3L);
}
最后一個是 RepositoryCode
Member findMemberById(Long id);
所以我的問題是,當我在控制臺上的控制器上列印出教練的名字時
它列印得很好。
但我知道事務已從服務結束所以持久性容器已關閉,這意味著無法匯入教練名稱,因為它的延遲加載和持久性容器已關閉,但列印得很好
我想知道為什么...
這是控制臺結果謝謝!
[2022-01-10 23:27:46.835] [http-nio-9000-exec-2] [] INFO o.a.c.c.C.[.[.[/] - Initializing Spring DispatcherServlet 'dispatcherServlet'
[2022-01-10 23:27:46.835] [http-nio-9000-exec-2] [] INFO o.s.w.s.DispatcherServlet - Initializing Servlet 'dispatcherServlet'
[2022-01-10 23:27:46.855] [http-nio-9000-exec-2] [] INFO o.s.w.s.DispatcherServlet - Completed initialization in 19 ms
Hibernate:
/* select
generatedAlias0
from
Member as generatedAlias0
where
generatedAlias0.id=:param0 */ select
member0_.member_id as member_i1_1_,
member0_.age as age2_1_,
member0_.username as username3_1_
from
member member0_
where
member0_.member_id=?
[2022-01-10 23:27:47.007] [http-nio-9000-exec-2] [4c0222d3] INFO p6spy - #1641824867007 | took 15ms | statement | connection 1| url jdbc:mariadb://patrick-lab.cjeq2ffynlc2.ap-northeast-2.rds.amazonaws.com:3306/patricklab?characterEncoding=UTF-8&serverTimezone=UTC
/* select generatedAlias0 from Member as generatedAlias0 where generatedAlias0.id=:param0 */ select member0_.member_id as member_i1_1_, member0_.age as age2_1_, member0_.username as username3_1_ from member member0_ where member0_.member_id=?
/* select generatedAlias0 from Member as generatedAlias0 where generatedAlias0.id=:param0 */ select member0_.member_id as member_i1_1_, member0_.age as age2_1_, member0_.username as username3_1_ from member member0_ where member0_.member_id=3;
[2022-01-10 23:27:47.170] [http-nio-9000-exec-2] [4c0222d3] INFO p6spy - #1641824867170 | took 12ms | commit | connection 1| url jdbc:mariadb://patrick-lab.cjeq2ffynlc2.ap-northeast-2.rds.amazonaws.com:3306/patricklab?characterEncoding=UTF-8&serverTimezone=UTC
;
Hibernate:
select
coachs0_.member_id as member_i4_0_0_,
coachs0_.coach_id as coach_id1_0_0_,
coachs0_.coach_id as coach_id1_0_1_,
coachs0_.career as career2_0_1_,
coachs0_.member_id as member_i4_0_1_,
coachs0_.name as name3_0_1_,
coachs0_.team_id as team_id5_0_1_
from
coach coachs0_
where
coachs0_.member_id=?
[2022-01-10 23:27:47.200] [http-nio-9000-exec-2] [4c0222d3] INFO p6spy - #1641824867200 | took 12ms | statement | connection 1| url jdbc:mariadb://patrick-lab.cjeq2ffynlc2.ap-northeast-2.rds.amazonaws.com:3306/patricklab?characterEncoding=UTF-8&serverTimezone=UTC
select coachs0_.member_id as member_i4_0_0_, coachs0_.coach_id as coach_id1_0_0_, coachs0_.coach_id as coach_id1_0_1_, coachs0_.career as career2_0_1_, coachs0_.member_id as member_i4_0_1_, coachs0_.name as name3_0_1_, coachs0_.team_id as team_id5_0_1_ from coach coachs0_ where coachs0_.member_id=?
select coachs0_.member_id as member_i4_0_0_, coachs0_.coach_id as coach_id1_0_0_, coachs0_.coach_id as coach_id1_0_1_, coachs0_.career as career2_0_1_, coachs0_.member_id as member_i4_0_1_, coachs0_.name as name3_0_1_, coachs0_.team_id as team_id5_0_1_ from coach coachs0_ where coachs0_.member_id=3;
[2022-01-10 23:27:47.213] [http-nio-9000-exec-2] [4c0222d3] INFO m.p.l.m.c.MemberController - Coach1
uj5u.com熱心網友回復:
我相信這是因為您使用的spring.jpa.open-in-view是設定為 true的 spring-boot 默認設定。
此屬性啟用OpenSessionInView模式,您可以簡單地認為在處理任何 HTTP 請求時(例如,在 Servlet 過濾器等中),事務將在開始時自動為您打開。因此,在您的服務方法執行之前,事務實際上已經打開,并且在您的服務方法完成后它仍然處于活動狀態。因此,LazyInitializationException即使您在服務方法之外訪問未初始化的屬性,您也不會遇到任何問題,因為事務仍然處于活動狀態。
關于 spring-boot 過去是否應該默認啟用它存在激烈的爭論。如果您有興趣,可以參考此內容以獲取更多詳細資訊。我個人建議關閉它。
uj5u.com熱心網友回復:
事務僅意味著您正在資料庫中的物理事務塊內執行一組操作。它不會關閉持久性背景關系。
另一方面,延遲加載與事務無關。延遲加載意味著hibernate在加載父級時實際上并沒有加載所有子級。相反,它會在請求時加載它們。你可以明確地請求這個,或者,這是更常見的,當你嘗試訪問一個孩子時,hibernate會自動加載它們。
在您的情況下,教練不是由Member m = memberService.createMember();它加載的,而是由 m.getCoachs()
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/409043.html
標籤:
