๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์›น๊ณต๋ทฐ/์Šคํ”„๋ง

์•Œ๊ณ ๋ณด๋‹ˆ .... ์˜์†์„ฑ ๋ฌธ์ œ. failed to lazily initialize a collection of role could not initialize proxy

by ์ด๋…ธํ‚ค_ 2021. 6. 8.

JPA๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•ด์•ผ๊ฒ ๋‹ค๊ณ  ๋งˆ์Œ๋จน๊ณ  ๊ฐœ๋ฐœ์‹œ์ž‘ํ•œ์ง€ 2์‹œ๊ฐ„.

์™€ ์ •๋ง ์ด ์—๋Ÿฌ ๋•Œ๋ฌธ์— ์˜ค๋Š˜ ์‚ฝ์งˆ์„ ๋„ˆ๋ฌด๋‚˜๋„ ๋งŽ์ด ํ–ˆ๋‹ค. 

 

6์›” 08, 2021 2:10:37 ์˜คํ›„ org.apache.catalina.core.StandardWrapperValve invoke ์‹ฌ๊ฐ: ๊ฒฝ๋กœ๊ฐ€ []์ธ ์ปจํ…์ŠคํŠธ์˜ ์„œ๋ธ”๋ฆฟ [dispatcher]์„(๋ฅผ) ์œ„ํ•œ Servlet.service() ํ˜ธ์ถœ์ด ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œ์ผฐ์Šต๋‹ˆ๋‹ค. com.fasterxml.jackson.databind.JsonMappingException: failed to lazily initialize a collection of role: com.rttq.user.domain.User.privs, could not initialize proxy - no Session (through reference chain: com.rttq.user.domain.User["privs"]) at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:390) at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:349)

 

์šฐ์„  Entity ํด๋ž˜์Šค๋Š” 

User : UserPriv(์‚ฌ์šฉ์ž๊ถŒํ•œ)

1     :    n  ๊ด€๊ณ„์ด๋‹ค. 

์ผ๋Œ€๋‹ค ๊ด€๊ณ„์—์„œ๋Š” "๋‹ค"์ชฝ์ด ๊ด€๊ณ„์˜ ์ฃผ์ธ์ด๋‹ค.

 

๊ทธ๋ž˜์„œ ์šฐ์„  ์‚ฌ์šฉ์ž๊ถŒํ•œ entity ํด๋ž˜์Šค์— @ManyToOne ์–ด๋…ธํ…Œ์ด์…˜์„ ๋‹ฌ์•„์ฃผ๊ณ . 

@Entity
@Table(name="user_priv")
public class UserPriv {
	@Id @GeneratedValue
	@Column(name="PRIV_ID")
	private Long id;
	
	@Enumerated(EnumType.STRING)
	private SvcType	svc_type;
	private int svc_id;
	private int priv_read;
	private int priv_write;
	private int priv_execute;
	
	private Timestamp time_update;
	
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name="USER_ID")
	private User user;
}

์‚ฌ์šฉ์ž entity์—๋Š” @OneToMany๋ฅผ ๋‹ฌ์•„์ค€๋‹ค. 

@Entity
@Table(name="user")
public class User {
	@Id @GeneratedValue
	@Column(name="USER_ID")
	private	Long id;
	
	@Column(nullable=false, unique=true)
	private String uid;
	
	@Lob
	private String passwd;
	private String name;
	private String tel;
	private String email;
	private String company;
	
	private Timestamp create_time;
	private Timestamp update_time;
	private Timestamp login_time;
	
	@OneToMany(mappedBy ="user")
	private List<UserPriv> privs = new ArrayList<>();
}

 

์•„๋ž˜๋Š” ๋‚˜์˜ ์ปจํŠธ๋กค๋Ÿฌ.

User object๋ฅผ json์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด Jackson ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€์ ธ๋‹ค์ผ๋‹ค. 

๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด ์ง€์ ์€ mapper.writeValueAsString(user)ํ•  ๋•Œ ๋ฐœ์ƒํ•œ ๊ฒƒ. 

user ๊ฐ์ฒด๋ฅผ ์„œ๋น„์Šค๋กœ๋ถ€ํ„ฐ ๋ฆฌํ„ด์„ ๋ฐ›์•˜์„ ๋•Œ, ์‚ฌ์‹ค User ๊ฐ์ฒด ๋‚ด๋ถ€์˜ Priv list๊ฐ’์€ ๋‚ด์šฉ์ด ์—†๋Š” ์ƒํƒœ์ด๋‹ค. 

๋˜ํ•œ ๋””๋ฒ„๊น…์„ ํ–ˆ์„ ๋•Œ priv๋Š” persistentbag์ด๋ผ๋Š” wrapper๋กœ ๋ณด์—ฌ์กŒ๋‹ค. 

PersistentBag (Hibernate API Documentation) (jboss.org)

 

PersistentBag (Hibernate API Documentation)

afterInitialize, afterRowInsert, beginRead, clearDirty, dirty, endRead, forceInitialization, getCachedSize, getIdentifier, getKey, getOrphans, getOwner, getQueuedOrphans, getRole, getSession, getSnapshot, getStoredSnapshot, getValue, hasQueuedOperations, i

docs.jboss.org

์ฐพ์•„๋ณธ ๊ฒฐ๊ณผ, user ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ด๋ฐ›์•˜์„ ๋•Œ๋Š” userpriv๊ฐ’์ด fetch๋˜์ง€ ์•Š์•˜๋Š”๋ฐ ์–ด์จŒ๋“  jackson mapper์—์„œ ์–˜๋ฅผ ๊ฐ์ฒด๋กœ ๋งŒ๋“ค๋ ค๊ณ  ํ•˜๋‹ค๋ณด๋‹ˆ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ๋˜ ๋ชจ์–‘์ด๋‹ค. 

๊ทธ๋ž˜์„œ Hibernate5Module์ด๋ผ๋Š” ๊ฒƒ์„ pom.xml์—๋„ jackson-datatype-hibernate5 dependancy๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค. 

์ด ๋ชจ๋“ˆ์€ fetchํ–ˆ์„ ๋•Œ, ๊ฐ’์ด ์—†์œผ๋ฉด null์„ ๋‚ด๋ถ€์ ์œผ๋กœ ๋„ฃ์–ด์ฃผ์–ด json์œผ๋กœ serializeํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ์ง€ ์•Š๊ฒŒ ํ•ด์ค€๋‹ค. 

mapper ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ›„, hibernate5Module์„ ๋“ฑ๋กํ•œ ํ›„, ํ•ด๋‹น mapper๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. 

	@GetMapping
	@RequestMapping("/profile/{id}")
	public String profile(@PathVariable Long id) throws JsonProcessingException
	{
		User user = userService.getOne(id);
		System.out.println("userid : " + id + ", user name :" 
				+ user.getName());
	
		ObjectMapper mapper = new ObjectMapper();
		mapper.registerModule(new Hibernate5Module());
		String str = mapper.writeValueAsString(user);
		return str;
	}

 

 

์ฐธ๊ณ 

pom.xml์— jack์‚ฌ์šฉ๊ณผ ๊ด€๋ จํ•ด ์ถ”๊ฐ€ํ•œ ๋‚ด์šฉ

 <!-- ๊ฐ์ฒด๋กœ ๊ฐ’์„ ์ฝ๊ฑฐ๋‚˜ ๋ฆฌํ„ดํ• ๋•Œ ์‚ฌ์šฉ -->
 <dependency>
 	<groupId>com.fasterxml.jackson.core</groupId>
 	<artifactId>jackson-core</artifactId>
 	<version>2.12.0</version>
 </dependency>

<dependency>
	<groupId>com.fasterxml.jackson.core</groupId>
	<artifactId>jackson-databind</artifactId>
	<version>2.12.0</version>
</dependency>

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.datatype/jackson-datatype-hibernate5 -->
<dependency>
	<groupId>com.fasterxml.jackson.datatype</groupId>
	<artifactId>jackson-datatype-hibernate5</artifactId>
	<version>2.12.0</version>
</dependency>

 

jpa ์˜์†์„ฑ ๊ด€๋ฆฌ ๋ถ€๋ถ„์€ ์ •๋ง ์ž˜ ๊ณต๋ถ€ํ•ด์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋‹ค์‹œํ•œ๋ฒˆ ๋“ค์—ˆ๋‹ค. 

๋Œ“๊ธ€