프록시 기초
em,getReference(Member.class,memberId): 데이터베이스 조회를 미루는 가짜 엔터티 객체 조회
특징
지연로딩 LAZY
@ManyToOne(fetch = FetchType.LAZY) // 이 방법은 프록시객체로 조회히한다
@JoinColumn(name = "TEAM_ID")
private Team team;
Team 객체를 LAZY 전략으로 조회select
m1_0.id,
m1_0.city,
m1_0.street,
m1_0.zipcode,
m1_0.EMP_START,
m1_0.WORK_STREET,
m1_0.WORK_ZIPCODE,
m1_0.TEAM_ID,
m1_0.username
from
Member m1_0
where
m1_0.id=?
Member 객체만 조회하면 Member 테이블만 조회함Team객체를 프록시로 조회함Member member3= em.find(Member.class, member.getId());
Team team2= member3.getTeam();
System.out.println(team2.getName());
select
t1_0.TEAM_ID,
t1_0.name
from
Team t1_0
where
t1_0.TEAM_ID=?
Team의 메서드를 호출하니 그때서야 Team 테이블에서 값 조회Member와 Team을 함께 자주 사용하면 즉시 로딩 사용 @ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "TEAM_ID")
private Team team;
select
m1_0.id,
m1_0.city,
m1_0.street,
m1_0.zipcode,
m1_0.EMP_START,
m1_0.WORK_STREET,
m1_0.WORK_ZIPCODE,
t1_0.TEAM_ID,
t1_0.name,
m1_0.username
from
Member m1_0
left join
Team t1_0
on t1_0.TEAM_ID=m1_0.TEAM_ID
where
m1_0.id=?
@ManyToOne,@OneToMany 는 기본이 즉시 로딩이므로 LAZY로 변경해야함 @OneToMany(mappedBy = "parent",cascade = CascadeType.PERSIST,orphanRemoval = true)
private List<Child> childList = new ArrayList<>();
public void addChild(Child child) {
childList.add(child);
child.setParent(this);
}
부모만 저장함에도 자식도 persist 됨
Parent parent = new Parent();
parent.setName("Jack");
Child child = new Child();
child.setName("Jackson");
parent.addChild(child);
em.persist(parent);
orphanRemoval=true em.persist(parent);
Parent find= em.find(Parent.class, parent.getId());
find.getChildList().removeAll(parent.getChildList());
발생 쿼리
Hibernate:
/* delete for hellojpa.Child */delete
from
Child
where
id=?
주의
@OneToMany,@OneToOne 만 가능@Entity로 정의하는 객체
@Embeddable: 값 타입을 정의하는 곳에 표시@Embedded: 값 타입을 사용하는 곳에 표시-장점
Period.isWork()처럼 해당 값 타입만 사용하는 의미있는 메서드를 만들 수 있음@AttributeOverrides,@AttributeOverride를 사용해서 컬럼명 속성을 재정의@Embeddable
@Setter
@Getter
@NoArgsConstructor
public class Address {
private String city;
private String street;
private String zipcode;
}
@Embedded
@AttributeOverrides({
@AttributeOverride(name = "city", column = @Column(name = "EMP_START")),
@AttributeOverride(name = "street", column = @Column(name = "WORK_STREET")),
@AttributeOverride(name = "zipcode", column = @Column(name = "WORK_ZIPCODE"))
})
private Address homeAddress;
setter를 제거해야한다Embeded로 받은 것은 객체이므로 equals로 동등성을 알아내야함주의