我有三個物體,其中兩個物體包含第三個物體的集合。當我通過使用第三個實體創建兩個“擁有”物體來設定它們時,只有其中一個可以正常作業。另一個在添加時拋出此例外,即使集合的設定方式完全相同:
“擁有”物體:
@Entity
class Source(
@OneToMany(mappedBy = "source", cascade = [CascadeType.ALL])
var targets: MutableSet<Target> = mutableSetOf(),
@Id @GeneratedValue
var id: Long? = null,
) {
fun addTarget(target: Target) {
targets.add(target)
target.source = this
}
}
@Entity
class Job(
@OneToMany(mappedBy = "job", cascade = [CascadeType.ALL])
var targets: MutableSet<Target> = mutableSetOf(),
@Id @GeneratedValue
var id: Long? = null,
) {
fun addTarget(target: Target) {
targets.add(target) // exception actually thrown here
target.job = this
}
}
相互“擁有”的物體:
@Entity
class Target(
@ManyToOne var source: Source? = null,
@ManyToOne var job: Job? = null,
@Id @GeneratedValue var id: Long? = null
)
這是設定:
@PostConstruct
@Transactional
fun init() {
val initialJob = Job()
initialJob.targets = mutableSetOf() // no idea why this is necessary, but without it I get the exception
jobRepository.save(initialJob)
val source = Source()
sourceRepository.save(source)
val target = Target()
source.addTarget(target) // this works fine
initialJob.addTarget(target) // but this doesn't unless I initialize the set above
targetRepository.save(target)
sourceRepository.save(source)
jobRepository.save(initialJob)
}
我很困惑為什么我需要手動初始化 Job 物體上的集合而不是 Source 物體上的集合,因為這些關系在我看來是完全相同的。另外,Job 物體已經在其建構式中初始化該集合。
uj5u.com熱心網友回復:
我認為問題在于@PostConstruct和的組合@Transactional。
在@PostConstruct之后被稱為postProcessBeforeInitialization舞臺。雖然@Transactional被上創建的代理postProcessAfterInitialization階段。
因此,該方法未包含在一個事務中,并且您會收到no session例外。
您可以嘗試使用該@EventListener方法。
@Component
class SomeListener {
@Autowired
private MyService service;
@EventListener
public void onInit(ContextRefreshedEvent e) {
service.init();
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/311329.html
上一篇:匹配特殊字符的重碼法
