Spring boot to associate two entities

Asked

Viewed 72 times

-2

I have a question about how to associate two entities using spring data + spring boot.

I have both relationships:

@Entity(name = "profiles")
class Profile(
        @field:Id
        @field:GeneratedValue(strategy = GenerationType.IDENTITY)
        val id: Long?,

        @field:NotNull
        @field:Size(min = 5, max = 50)
        var name: String?,

        @field:NotNull
        @field:Column(unique = true)
        @field:Size(max = 120)
        var contactEmail: String?,

        @field:NotNull
        @field:Column(unique = true) @Size(max = 15)
        var contactCellphone: String?,

        @field:Column(nullable = false)
        var createdAt: Date?,

        @field:Column(nullable = false)
        var updatedAt: Date?,

        @JsonIgnore()
        @OneToMany(mappedBy = "profile", cascade = arrayOf(CascadeType.ALL), fetch = FetchType.LAZY)
        var debits: List = emptyList()
) {
    @PrePersist
    fun prePersist() {
        this.createdAt = Date();
        this.updatedAt = Date();
    }

    @PreUpdate
    fun preUpdate() {
        this.updatedAt = Date()
    }
}
@Entity(name = "debits")
data class Debit(
        @field:Id
        @field:GeneratedValue(strategy = GenerationType.IDENTITY)
        val id: Long?,

        @field:NotNull
        @field:Digits(integer = 5, fraction = 2)
        @field:Min(1)
        var debits: BigDecimal?,

        @field:NotNull
        @field:Enumerated(EnumType.STRING)
        var status: DebitStatus = DebitStatus.OPENED,

        @field:Column(nullable = false)
        var createdAt: Date?,

        @field:Column(nullable = false)
        var updatedAt: Date?,

        @JsonIgnore()
        @ManyToOne(fetch = FetchType.EAGER)
        @JoinColumn(name = "profile_id", nullable = false)
        val profile: Profile? = null,

        @JsonIgnore()
        @ManyToOne(fetch = FetchType.EAGER)
        @JoinColumn(name = "notification_rule_id")
        val notificationRule: NotificationRule? = null
) {
    @PrePersist
    fun prePersist() {
        this.createdAt = Date();
        this.updatedAt = Date();
    }

    @PreUpdate
    fun preUpdate() {
        this.updatedAt = Date()
    }
}

enum class DebitStatus {
    OPENED, CLOSED, DISABLED
}
@RestController
@RequestMapping("/debits")
class DebitController {
    @Autowired
    private val repository: DebitRepository? = null

    @GetMapping
    fun index(): List {
        return repository!!.findAll().toList()
    }

    @GetMapping("/{id}")
    fun show(@PathVariable("id") debit: Debit): Debit {
        return debit;
    }

    @PostMapping
    fun create(@Valid @RequestBody debit: Debit?): Debit {
        return repository!!.save(debit!!)
    }

    @PutMapping("/{id}")
    fun update(@PathVariable(value = "id") debit: Debit, @Valid @RequestBody newDebit: Debit): Debit {
        debit.apply {
            this.debits = newDebit.debits ?: this.debits
            this.status = newDebit.status ?: this.status
        }

        return repository!!.save(debit)
    }
}

After creating the profile i am trying to create the debit by already associating the debit in an existing profile. But it gives an error:


{
    "debits": 100.39,
    "profile": 1
}

And the mistake:

{
    "timestamp": "2020-06-21T18:05:43.316+00:00",
    "status": 500,
    "error": "Internal Server Error",
    "trace": "Caused by: [... um monte de log inútil pra sua pergunta], org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: NULL not allowed for column \"PROFILE_ID\"; SQL statement:insert into debits (id, created_at, debits, notification_rule_id, profile_id, status, updated_at) values (null, ?, ?, ?, ?, ?, ?) [23502-200]",
    "message": "could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement",
    "path": "/debits"
}

Is there a possibility to create and already associate an entity in the other? If I can do it using spring??

  • If I understand your question, I don’t think you can automatically. You will have, via constructor or Setter itself, to inform the entity Debit which the Profile associated, searching the database and then passing it to the entity Debit. Ah, next time, do an edit on that stacktrace. 99% of it is useless to your problem. Help us help you.

1 answer

0


The way I managed to do it was to add Annotation @Jsonmanagedreference to the relationship and it worked smoothly.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.