Eager 인 경우
@Entity
data class Parent (
@Id
@GeneratedValue
val id: Long = 0,
@BatchSize(size = 5)
@OneToMany(mappedBy = "parent", fetch = FetchType.EAGER, cascade = [CascadeType.PERSIST])
val children: MutableList<Child> = mutableListOf()
) {
fun prepareForSave(): Parent {
this.children.forEach {
it.parent = this
}
return this
}
}
@Entity
data class Child (
@Id
@GeneratedValue
val id: Long = 0
) {
@ManyToOne(optional = false)
lateinit var parent: Parent
}
// insert
val parent = Parent()
for (i in 1..10) {
parent.children.add(Child())
}
val savedParent = parentRepository.save(parent.prepareForSave())
val getParent = parentRepository.getOne(savedParent.id)
for (child in getParent.children) {
print(child.id)
}
Hibernate: insert into parent values ( )
Hibernate: insert into child (parent) values (?)
Hibernate: insert into child (parent) values (?)
Hibernate: insert into child (parent) values (?)
Hibernate: insert into child (parent) values (?)
Hibernate: insert into child (parent) values (?)
Hibernate: insert into child (parent) values (?)
Hibernate: insert into child (parent) values (?)
Hibernate: insert into child (parent) values (?)
Hibernate: insert into child (parent) values (?)
Hibernate: insert into child (parent) values (?)
Hibernate:
select parent0_.id as id1_62_0_,
children1_.parent as parent2_33_1_,
children1_.id as id1_33_1_,
children1_.id as id1_33_2_,
children1_.parent as parent2_33_2_
from parent parent0_
left outer join child children1_ on parent0_.id = children1_.parent
where parent0_.id = ?;
12345678910
// select 조회
val parent = parentRepository.getOne(5)
for (child in parent.children) {
print(child.id)
}
Hibernate:
select parent0_.id as id1_62_0_,
children1_.parent as parent2_33_1_,
children1_.id as id1_33_1_,
children1_.id as id1_33_2_,
children1_.parent as parent2_33_2_
from parent parent0_
left outer join child children1_ on parent0_.id = children1_.parent
where parent0_.id = ?;
12345678910
LAZY 인 경우
@Entity
data class Parent (
@Id
@GeneratedValue
val id: Long = 0,
@BatchSize(size = 5)
@OneToMany(mappedBy = "parent", cascade = [CascadeType.PERSIST])
val children: MutableList<Child> = mutableListOf()
) {
fun prepareForSave(): Parent {
this.children.forEach {
it.parent = this
}
return this
}
}
// insert
val parent = Parent()
for (i in 1..10) {
parent.children.add(Child())
}
val savedParent = parentRepository.save(parent.prepareForSave())
val getParent = parentRepository.getOne(savedParent.id)
for (child in getParent.children) {
print(child.id)
}
Hibernate: insert into parent values ( )
Hibernate: insert into child (parent) values (?)
Hibernate: insert into child (parent) values (?)
Hibernate: insert into child (parent) values (?)
Hibernate: insert into child (parent) values (?)
Hibernate: insert into child (parent) values (?)
Hibernate: insert into child (parent) values (?)
Hibernate: insert into child (parent) values (?)
Hibernate: insert into child (parent) values (?)
Hibernate: insert into child (parent) values (?)
Hibernate: insert into child (parent) values (?)
Hibernate: select parent0_.id as id1_62_0_ from parent parent0_ where parent0_.id=?
Hibernate:
select children0_.parent as parent2_33_1_,
children0_.id as id1_33_1_,
children0_.id as id1_33_0_,
children0_.parent as parent2_33_0_
from child children0_
where children0_.parent = ?;
Hibernate: select parent0_.id as id1_62_0_ from parent parent0_ where parent0_.id=?
12345678910
// select 조회
val parent = parentRepository.getOne(5)
for (child in parent.children) {
print(child.id)
}
Hibernate: select parent0_.id as id1_62_0_ from parent parent0_ where parent0_.id=?
Hibernate:
select children0_.parent as parent2_33_1_,
children0_.id as id1_33_1_,
children0_.id as id1_33_0_,
children0_.parent as parent2_33_0_
from child children0_
where children0_.parent = ?;
Hibernate: select parent0_.id as id1_62_0_ from parent parent0_ where parent0_.id=?
12345678910
insert 는.. insert into parent values ( ) 로 values() 를 사용하고 child 의 insert 가 row 단위로 로그가 있다고 해도.. 내부적으로 묶어서 보낸다고 치더라도, 조회는 뭔가 이상하네요..?