인프런 커뮤니티 질문&답변

오기훈님의 프로필 이미지

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

org.hibernate.TransientPropertyValueException 질문드립니다.

작성

·

1.1K

0

https://www.inflearn.com/course/ORM-JPA-Basic/lecture/21720?tab=curriculum&volume=1.00

 프로젝션(SELECT)  강의 4분쯤 보던중 오류를 만나게 되었습니다. 

 

java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : jpql.domain.Member.team -> jpql.domain.Team

at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:151)

at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181)

at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:188)

at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1366)

at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1349)

at jpql.JpqlMain.main(JpqlMain.java:27)

 

찾아보던 중 ManyToOne 또는 OneToMany 관계시 

Team의 FK 값 을 영속화 하지 않은 채 Member를 영속화 하여 오류가 난다고 하여 

2가지 해결책을 찾아보았습니다. 

1. Team 을 생성후 영속화, 그리고 member.setTeam(team) 으로 팀을 멤버에 추가

2.  @ManyToOne(cascade=CascadeType.ALL) 로 영속성 전이 설정 

 

하지만, 강의를 보던중 4:20 초 영상을 보니 강사님의 예제 실행시 

TEAM_ID 는 NULL로 들어간 것이 확인 되었습니다. 

 

위의 1번은 Team을 set 했기 때문에 FK 가 당연히 있었고, 

2 번을 실행시 FK 값은 있었지만 Team의 name이 Null로 값이 들어가 있었습니다.

 

@ManyToOne의 optional이나, mappedBy의 nullable에 대해 설정은 하시지 않은거같은데 

제가 빠트린 무언가 있을까요 ?! 

 

Member.java

```

@Entity
public class Member {

public Member(){
}

@Id @GeneratedValue
private Long id;

private String username;

private int age;

@ManyToOne
@JoinColumn(name = "TEAM_ID", nullable = true)
private Team team = new Team();

```

> Team.java

```

@Entity
public class Team {

public Team() {
}

@Id @GeneratedValue
private Long id;

private String name;

@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<>();

```

> JpqlMain.java

```

Member member1 = new Member();
member1.setUsername("member1");
member1.setAge(35);

em.persist(member1);

em.flush();
em.clear();

List<Member> result = em.createQuery("SELECT m FROM Member m", Member.class)
.getResultList();

Member findMember = result.get(0);
findMember.setAge(28);

tx.commit();

```

답변 1

1

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 오기훈님

public class Member {

public Member(){
}

@Id @GeneratedValue
private Long id;

private String username;

private int age;

@ManyToOne
@JoinColumn(name = "TEAM_ID", nullable = true)
private Team team = new Team(); //이 부분을 변경해주세요.

 

다음을 참고해서 수정해주세요.

//기존 코드

private Team team = new Team();

//변경 코드

private Team team;

감사합니다.

오기훈님의 프로필 이미지
오기훈
질문자

엔티티를 생성할때, new Team()을 해서 그렇군요

감사합니다 !!