Kotlin JpaRepository сохраняет новый объект empy для обновления

Поэтому я использую пружинный ботинок и котлин. Когда я публикую объект, я использую 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)
    }
}

пожалуйста, разместите код Claim.kt

Willi Mentzel 04.08.2018 02:17

Я устал, но ТАК согласился, что это был в основном код ...

Casey Daniel 04.08.2018 02:30

пожалуйста, отформатируйте правильно

Willi Mentzel 04.08.2018 02:32

@WilliMentzel извините, что не так с форматированием?

Casey Daniel 04.08.2018 02:44

пожалуйста, сделайте отступ в коде правильно

Willi Mentzel 04.08.2018 02:46

@WilliMentzel все отступили.

Casey Daniel 04.08.2018 02:48

в saveClaim .. вы уверены, что идете в ветку if, а не в другую? если вы действительно перейдете в ветку if: какой uuid имеет утверждение (используйте отладчик).

Willi Mentzel 04.08.2018 03:04

@WilliMentzel Я знаю. Я проверил отладчик, и он доходит до этой ветки. Когда я mdofiy запрос не попадать в эту ветку, он создает 2 новые строки. Один заполнил один пустой. Я вставлю в пост то, что я имею в виду под заполненным и пустым

Casey Daniel 04.08.2018 03:07

Я думаю, что saveClaim вызывается дважды, пожалуйста, проверьте, что

Willi Mentzel 04.08.2018 03:15

При запуске отладчика строка для findbyid используется только один раз. Просмотр проекта показывает, что saveClaim вызывается только один раз.

Casey Daniel 04.08.2018 03:18

Пожалуйста, создайте минимальный пример, в котором проблема может быть воспроизведена. все отбросить в сторону

Willi Mentzel 04.08.2018 03:21

Я имею в виду, что помимо того, что было опубликовано, у меня есть только модели связанных доменов, несколько JSON DTO и одна конечная точка публикации. Это буквально мой код на данный момент

Casey Daniel 04.08.2018 03:23

создать единую функцию, которая может воспроизводить нежелательное поведение, изолировать его от всего остального. запустите его с жестко закодированными данными.

Willi Mentzel 04.08.2018 03:26

@WilliMentzel итак ..... Я добавил функцию, которая будет выполняться после завершения запуска. Он добавляет две строки в БД, ни один из них не имеет этого UUID. Когда захожу в отладчик. Правильное утверждение с UUID передается функции и изменяется. Но объект утверждения, который сохраняется, не ...

Casey Daniel 04.08.2018 03:55

Итак, теперь он обновляет правильный, но по-прежнему создает второй.

Casey Daniel 04.08.2018 04:22
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
0
15
488
1

Ответы 1

Итак, ответ в том, как я сделал сопоставление кодов оплаты. Удаление этой связи больше не приводило к сохранению дубликата.

Отношениям нужен флаг @Transient и сопоставление кодов биллинга, необходимое для сопоставления с помощью

Другие вопросы по теме