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)
์ฐพ์๋ณธ ๊ฒฐ๊ณผ, 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 ์์์ฑ ๊ด๋ฆฌ ๋ถ๋ถ์ ์ ๋ง ์ ๊ณต๋ถํด์ผ๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค์ํ๋ฒ ๋ค์๋ค.
๋๊ธ