Spring 春季冬眠jpa多对多
我试着让病人在我的服务中找一位这样的医生。 起初我给医生加了一些宠物。然后,当我尝试获取宠物列表时,它将被返回,但之后记录将从doctor_宠物加入表中删除,下次结果将是一个空列表Spring 春季冬眠jpa多对多,spring,hibernate,jpa,many-to-many,Spring,Hibernate,Jpa,Many To Many,我试着让病人在我的服务中找一位这样的医生。 起初我给医生加了一些宠物。然后,当我尝试获取宠物列表时,它将被返回,但之后记录将从doctor_宠物加入表中删除,下次结果将是一个空列表 @RequestMapping(value = ["/{id}/patients"], method = [RequestMethod.GET], produces = ["application/json"]) @ResponseStatus(HttpStatus.OK) fun getPatients(@Path
@RequestMapping(value = ["/{id}/patients"], method = [RequestMethod.GET], produces = ["application/json"])
@ResponseStatus(HttpStatus.OK)
fun getPatients(@PathVariable("id") id: Long): ResponseEntity<List<Pet>> = ResponseEntity(doctorService.getPets(id), HttpStatus.OK)
@RequestMapping(value=[“/{id}/patients”],method=[RequestMethod.GET],products=[“application/json”])
@ResponseStatus(HttpStatus.OK)
有趣的getPatients(@PathVariable(“id”)id:Long):ResponseEntity=ResponseEntity(doctorService.getPets(id),HttpStatus.OK)
博士班看起来像这样
@Entity
class Doctor: Serializable {
@Id
@GeneratedValue
var id: Long = 0
lateinit var name: String
@ManyToMany(cascade = [CascadeType.ALL])
@JoinTable(name = "doctor_pet"
, joinColumns = [JoinColumn(name = "doctor_id")]
, inverseJoinColumns = [JoinColumn(name = "pet_id")])
var pets = mutableListOf<Pet>()
}
@Entity
class Pet {
@Id
@GeneratedValue
var id: Long = 0
lateinit var name: String
var yearOfBorn: Int = 0
@ManyToMany(mappedBy = "pets")
var doctors = mutableListOf<Doctor>()
override fun toString(): String = "$name was born in $yearOfBorn."
}
@实体
类博士:可序列化{
@身份证
@生成值
变量id:Long=0
lateinit变量名称:String
@多个(级联=[CascadeType.ALL])
@JoinTable(name=“医生\宠物”
,joinColumns=[JoinColumn(name=“doctor\u id”)]
,inverseJoinColumns=[JoinColumn(name=“pet_id”)])
var pets=mutableListOf()
}
宠物看起来像这样
@Entity
class Doctor: Serializable {
@Id
@GeneratedValue
var id: Long = 0
lateinit var name: String
@ManyToMany(cascade = [CascadeType.ALL])
@JoinTable(name = "doctor_pet"
, joinColumns = [JoinColumn(name = "doctor_id")]
, inverseJoinColumns = [JoinColumn(name = "pet_id")])
var pets = mutableListOf<Pet>()
}
@Entity
class Pet {
@Id
@GeneratedValue
var id: Long = 0
lateinit var name: String
var yearOfBorn: Int = 0
@ManyToMany(mappedBy = "pets")
var doctors = mutableListOf<Doctor>()
override fun toString(): String = "$name was born in $yearOfBorn."
}
@实体
等级宠物{
@身份证
@生成值
变量id:Long=0
lateinit变量名称:String
var yearOfBorn:Int=0
@许多(mappedBy=“宠物”)
var=mutableListOf()
override fun toString():String=“$name出生于$yearOfBorn。”
}
我从DoctorDao存储库中得到宠物列表,如下所示
// Get pets for doctor from DoctorDaoImpl
override fun getPets(id: Long): List<Pet> {
val doctor = entityManager.find(Doctor::class.java, id)
return doctor.pets
}
@Repository
@Transactional
open class DoctorServiceImpl @Autowired constructor(@Qualifier("doctorDao") val doctorDao: DoctorDao) : DoctorService {
override fun saveDoctor(doctor: Doctor) {
doctorDao.saveDoctor(doctor)
}
override fun updateDoctor(doctor: Doctor) {
doctorDao.updateDoctor(doctor)
}
@Transactional(readOnly = true)
override fun findDoctor(id: Long): Doctor = doctorDao.findDoctor(id)
override fun getPets(id: Long): List<Pet> = doctorDao.getPets(id)
}
//从DoctorDaoImpl为医生获取宠物
覆盖有趣的getPets(id:Long):列表{
val doctor=entityManager.find(doctor::class.java,id)
归还宠物医生
}
@存储库
@交易的
开放类DoctorServiceImpl@Autowired构造函数(@Qualifier(“doctorDao”)val doctorDao:doctorDao):DoctorService{
医生(医生:医生){
医生道。保存医生(医生)
}
覆盖有趣的updateDoctor(医生:医生){
doctorDao.updateDoctor(医生)
}
@事务(只读=真)
覆盖findDoctor(id:Long):医生=doctorDao.findDoctor(id)
覆盖有趣的getPets(id:Long):List=doctorDao.getPets(id)
}
我错了什么
更新
在我从医生那里得到宠物之后
休眠:从doctor_宠物中删除,其中doctor_id=
整个日志都是
休眠:选择doctor0\u0.id作为id0\u0\u0,选择doctor0\u0.name作为name0\u0_
来自Doctor doctor0,其中doctor0.id=?休眠:选择
pets0.doctor\u id为doctor1\u 0\u 1,pets0.pet\u id为pet2\u 4\u 1,pet1\u.id
作为id1_0_,pet1_.name作为name1_0_,pet1_.yearOfBorn作为yearOfBorn1_0_
从doctor_pet pets0_uu内部加入pets0上的pet pet1_uu.pet_uid=pet1_u.id
其中pets0.doctor\u id=?休眠:从doctor_宠物中删除
医生id=?休眠:选择doctors0.pet\u id作为pet2\u 1\u 1\u,
Doctor0.DoctorID为doctor1.4.1,doctor1.id为id0.0,
医生1。姓名0\u 0\u来自医生\u宠物医生0\u内部加入医生
doctor1在Doctor0.doctor\u id=doctor1\u.id,其中Doctor0.pet\u id=
也许您的服务类中缺少@Transactional?参见+Ryan Dawson,我设置并声明了transactionManager。我所有的服务都是事务性的。如果我将链接宠物添加到医生,我可以在MySql Workbrencs中看到它是成功的,并且在我第一次为医生查询宠物时,宠物被列出,但我可以在Workbrencs中看到,在查询完成后,联接表是空的。我对Spring/Hibernate/Jpa非常陌生。我一整天都在试着解决这个问题。为什么joinable会在从医生那里得到宠物清单后被清除,但我不能。我要分享我的比特桶回购协议。