Поэтому я использую пружинный ботинок и котлин. Когда я публикую объект, я использую uuid для поиска, если он у меня есть в базе данных. Если да, то я изменяю его, в противном случае использую новый экземпляр.
Когда я смотрю в базу данных, я вижу свою обновленную версию, а затем новую пустую строку.
Я могу видеть обновленную метку времени, и если я использую отладчик для управления значениями, он сохраняет. однако всегда есть новая строка с новым идентификатором, и все поля пусты
Услуга
@Service("claimService")
class ClaimService {
@Autowired
lateinit var billingCodeRepository: BillingCodeRepository
@Autowired
lateinit var claimRepository: ClaimRepository
@Autowired
lateinit var specialtyRepository: SpecialtyRepository
@Autowired
lateinit var doctorRepository: DoctorRepository
fun saveClaim(submittedClaim: ClaimDto) {
val existingClaim: Optional<Claim> = claimRepository.findById(submittedClaim.claim.uuid)
if (existingClaim.isPresent)
{
convertClaimFromDto(submittedClaim, existingClaim.get())
} else {
val claim = Claim()
convertClaimFromDto(submittedClaim, claim)
}
}
fun convertClaimFromDto(submittedClaim: ClaimDto, claim: Claim)
{
claim.payProgram = submittedClaim.claim.payProgram
claim.dxCode = submittedClaim.claim.dxCode
claim.facility = submittedClaim.claim.facility
claim.billingDate = DateUtil.convertDate(submittedClaim.claim.claimDate)
claim.patient = convertPatientFromDto(submittedClaim.claim.patient)
for(billingCode in submittedClaim.claim.billedCodes)
{
val billedCode: Optional<BillingCode> = billingCodeRepository.findById(billingCode.code)
if (billedCode.isPresent)
{
val claimCode = BilledCodes()
claimCode.billingCode = billedCode.get()
claimCode.billed = billingCode.amountBilled
claim.billedCodes.add(claimCode)
}
}
//Test values
val testDoc: Optional<ca.billingpro.billingcore.Domain.Doctor> = doctorRepository.findById(1)
claim.doc = testDoc.get()
claim.createdBy = "TestPoint"
claimRepository.save(claim)
}
fun convertPatientFromDto(submittedPatient: ClaimDto.Claim.Patient): Patient
{
val patient = Patient()
patient.DOB = DateUtil.convertDate(submittedPatient.DOB)
patient.name = submittedPatient.name
patient.ohipNo = submittedPatient.ohipNo
patient.ohipVer = submittedPatient.ohipNo
patient.sex = submittedPatient.sex
return patient
}
}
требовать
@Entity
data class Claim (
@Id
@GeneratedValue(generator = "uuid2")
@GenericGenerator(name = "uuid2", strategy = "uuid2")
var uuid: String = ""
)
{
@GeneratedValue(strategy = GenerationType.SEQUENCE)
var claimNo: Long = 0
var status: ClaimStatus = ClaimStatus.CREATED
var billingDate: LocalDate = LocalDate.now()
var lastUpdated: LocalDateTime = LocalDateTime.now()
var facility: String = ""
var payProgram: String = ""
var createdAt:LocalDateTime = LocalDateTime.now()
var createdBy: String = ""
var dxCode: String = ""
var notes: String = ""
@ManyToOne(cascade = [CascadeType.ALL])
var patient: Patient = Patient()
@ManyToOne(cascade = [CascadeType.ALL])
var doc: Doctor = Doctor()
@OneToMany(cascade = [CascadeType.ALL], mappedBy = "claim")
var billedCodes: MutableList<BilledCodes> = mutableListOf<BilledCodes>()
@PrePersist
@PreUpdate
fun updateClaim()
{
lastUpdated = LocalDateTime.now()
}
}
Репозиторий
@Repository
interface ClaimRepository : CrudRepository<Claim, String>
ряды
5bdf8247-5c66-4a9e-9101-450588d5e6b8 2018-01-01 2 2018-08-03 20:41:03 TestPoint 1234 1234 2018-08-03 20:56:41 "" HCP 0 1 47
a9200e84-643b-409a-9c44-2b69aa8a9823 2018-08-03 0 2018-08-03 20:56:41 "" "" "" 2018-08-03 20:56:41 "" "" 0 23 46
16249817-6f4b-46df-a959-ec0595bb06d7 2018-01-01 0 2018-08-03 20:57:03 TestPoint 1234 1234 2018-08-03 20:57:03 "" HCP 0 1 48
6799275b-e067-439e-aec1-2f9166e9b2ba 2018-08-03 0 2018-08-03 20:57:03 "" "" "" 2018-08-03 20:57:03 "" "" 0 24 49
76c2fd49-5a92-4e3a-a8db-d882beb635e2 2018-01-01 0 2018-08-03 21:07:14 TestPoint 1234 1234 2018-08-03 21:07:14 "" HCP 0 1 50
fec419d9-ae9d-4d53-a287-add14b1cd373 2018-08-03 0 2018-08-03 21:07:14 "" "" "" 2018-08-03 21:07:14 "" "" 0 25 51
функция тестирования
@Component
class ApplicationStartup: ApplicationListener<ApplicationReadyEvent>
{
@Autowired
lateinit var claimService: ClaimService
override fun onApplicationEvent(event: ApplicationReadyEvent) {
//var claimService: ClaimService = ClaimService()
var testStr = "{\"claim\":{\"uuid\": \"5bdf8247-5c66-4a9e-9101-450588d5e610\",\"claimNo\": 123,\"status\": \"CREATED\",\"claimDate\": \"2018-01-01\",\"facility\": \"1234\",\"dxCode\": \"1234\",\"notes\": \"test notes\",\"payProgram\": \"HCP\",\"patient\": {\"name\": \"first last\",\"DOB\": \"1992-05-06\",\"ohipNo\": \"123456789\",\"verCode\": \"AA\",\"sex\": \"M\"},\"billedCodes\": [{\"code\": \"A001A\",\"amountBilled\": 19.21,\"amountPaid\": 0.0}]}}"
val mapper = jacksonObjectMapper()
val claimTest = mapper.readValue<ClaimDto>(testStr)
claimService.saveClaim(claimTest)
}
}
Я устал, но ТАК согласился, что это был в основном код ...
пожалуйста, отформатируйте правильно
@WilliMentzel извините, что не так с форматированием?
пожалуйста, сделайте отступ в коде правильно
@WilliMentzel все отступили.
в saveClaim .. вы уверены, что идете в ветку if, а не в другую? если вы действительно перейдете в ветку if: какой uuid имеет утверждение (используйте отладчик).
@WilliMentzel Я знаю. Я проверил отладчик, и он доходит до этой ветки. Когда я mdofiy запрос не попадать в эту ветку, он создает 2 новые строки. Один заполнил один пустой. Я вставлю в пост то, что я имею в виду под заполненным и пустым
Я думаю, что saveClaim вызывается дважды, пожалуйста, проверьте, что
При запуске отладчика строка для findbyid используется только один раз. Просмотр проекта показывает, что saveClaim вызывается только один раз.
Пожалуйста, создайте минимальный пример, в котором проблема может быть воспроизведена. все отбросить в сторону
Я имею в виду, что помимо того, что было опубликовано, у меня есть только модели связанных доменов, несколько JSON DTO и одна конечная точка публикации. Это буквально мой код на данный момент
создать единую функцию, которая может воспроизводить нежелательное поведение, изолировать его от всего остального. запустите его с жестко закодированными данными.
@WilliMentzel итак ..... Я добавил функцию, которая будет выполняться после завершения запуска. Он добавляет две строки в БД, ни один из них не имеет этого UUID. Когда захожу в отладчик. Правильное утверждение с UUID передается функции и изменяется. Но объект утверждения, который сохраняется, не ...
Итак, теперь он обновляет правильный, но по-прежнему создает второй.




Итак, ответ в том, как я сделал сопоставление кодов оплаты. Удаление этой связи больше не приводило к сохранению дубликата.
Отношениям нужен флаг @Transient и сопоставление кодов биллинга, необходимое для сопоставления с помощью
пожалуйста, разместите код Claim.kt