작성
·
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()을 해서 그렇군요
감사합니다 !!