@file:Suppress("DuplicatedCode")
package test
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
import org.springframework.data.repository.CrudRepository
import javax.annotation.PostConstruct
import javax.persistence.*
fun main(args: Array<String>)
{
runApplication<TestApplication>(*args)
}
@SpringBootApplication
class TestApplication(
val personRepository: PersonRepository,
val vehicleRepository: VehicleRepository
)
{
@PostConstruct
fun init()
{
var p1 = personRepository.save(Person(name = "Fred", age = 30))
println(" ")
p1.vehicles += vehicleRepository.save(Vehicle(type = "Car", brand = "BMW"))
personRepository.save(p1)
println(" ")
p1.vehicles += vehicleRepository.save(Vehicle(type = "Car", brand = "BMW"))
personRepository.save(p1)
println(" ")
p1.vehicles += vehicleRepository.save(Vehicle(type = "Car", brand = "BMW"))
personRepository.save(p1)
}
}
interface PersonRepository : CrudRepository<Person, Long>
interface VehicleRepository : CrudRepository<Vehicle, Long>
@Entity
data class Person(
@Id
@GeneratedValue
val id: Long = 0,
val name: String,
val age: Int,
@OneToMany
@OrderColumn
@JoinColumn(name = "personId")
val vehicles: MutableList<Vehicle> = ArrayList()
)
@Entity
data class Vehicle(
@Id
@GeneratedValue
val id: Long = 0,
var type: String,
var brand: String
)
日志
hibernate:从hibernate\序列中选择next\ val作为id\ val进行更新
hibernate:更新hibernate\u sequence set next\u val=?下一个值在哪里?
休眠:在person(age,name,id)中插入值(?,?)
hibernate:从hibernate\序列中选择next\ val作为id\ val进行更新
hibernate:更新hibernate\u sequence set next\u val=?下一个值在哪里?
休眠:插入车辆(品牌、类型、id)值(?,?)
休眠:选择[…]
休眠:选择[…]
hibernate:更新车辆集person\u id=?,vehicles\u order=?其中id=?
hibernate:从hibernate\序列中选择next\ val作为id\ val进行更新
hibernate:更新hibernate\u sequence set next\u val=?下一个值在哪里?
休眠:插入车辆(品牌、类型、id)值(?,?)
休眠:选择[…]
休眠:选择[…]
hibernate:更新车辆集person\u id=?,vehicles\u order=?其中id=?
hibernate:更新车辆集person\u id=?,vehicles\u order=?其中id=?
hibernate:从hibernate\序列中选择next\ val作为id\ val进行更新
hibernate:更新hibernate\u sequence set next\u val=?下一个值在哪里?
休眠:插入车辆(品牌、类型、id)值(?,?)
休眠:选择[…]
休眠:选择[…]
hibernate:更新车辆集person\u id=?,vehicles\u order=?其中id=?
hibernate:更新车辆集person\u id=?,vehicles\u order=?其中id=?
hibernate:更新车辆集person\u id=?,vehicles\u order=?其中id=?
问题
每增加一辆车,hibernate就会再次更新所有其他车。我注意到如果我改变 personRepository.save(p1)
至 p1 = personRepository.save(p1)
,工作正常,只更新新车。为什么?hibernate是否有内部“提交id”?
另外,如何将此代码转换为事务?
谢谢。
1条答案
按热度按时间ippsafx71#
每次呼叫
save
正在呼叫EntityManager#merge
它将当前对象状态刷新到数据库,可能会返回一个新对象,然后该对象将被“管理”,这意味着对该对象所做的更改将在事务结束时自动刷新。您可以使用@Transactional
注解,但不确定这是否也适用于@PostConstruct
. 在事务中save
是托管的,因此在事务结束时自动刷新更改。您可以使用如下代码: