我读到,由于Spring默认的AOP实现,将@Scheduled
和@Transactional
批注放在一起并不是一个好习惯。 (代理类等)
我决定自己尝试一下,并且创建了一个非常短的应用程序进行测试,但是令人惊讶的是,当我将这些内容放在一起以及为注释创建单独的Schedule服务时,我的代码也可以正常工作。
@Entity
class AEntity(
@OneToMany(mappedBy = "aEntity", fetch = FetchType.LAZY, cascade = [CascadeType.REMOVE])
var bEntities: MutableSet<BEntity>? = null,
@Id @GeneratedValue var id: Long? = null
)
@Entity
class BEntity(
@ManyToOne
@JoinColumn(name = "a_entity_id", referencedColumnName = "id")
var aEntity: AEntity,
@Id @GeneratedValue var id: Long? = null
)
服务:
@Service
class AService(val aRepository: ARepository) {
@Scheduled(fixedRate = 5000)
@Transactional
fun test() {
val aEntity = aRepository.findOneById(1)
aEntity?.bEntities?.forEach {
println(it.id)
}
}
}
您可以从here进入我的完整项目