Встраиваемый EmbeddedId сгенерировал новую таблицу/entty

#hibernate #kotlin #jpa #composite-primary-key

Вопрос:

Я не уверен, в чем причина, по которой этот код создает новую таблицу. Предполагается LockDatabaseRecordKeyId , что это составной ключ LockDatabaseRecordKey сущности, но во время сборки он автоматически создает другую таблицу.

 @Embeddable
open class LockDatabaseRecordKeyId : Serializable {
    @Column(name = "database_record_id")
    lateinit var databaseRecordId: UUID

    @Column(name = "key_id")
    lateinit var keyId: UUID

    override fun equals(other: Any?): Boolean {
        if (other == null) return false
        return (other is HouseKeyId) amp;amp; other.databaseRecordId == this.databaseRecordId amp;amp; other.keyId == this.keyId
    }

    override fun hashCode(): Int {
        return "${databaseRecordId}.${keyId}".hashCode()
    }
}
 

и это LockDatabaseRecordKey сущность

 
@Entity
@Table(name = "lock_database_record_keys",
        uniqueConstraints = [
            UniqueConstraint(columnNames = arrayOf("database_record_id", "key_id"))
        ]
)
open class LockDatabaseRecordKey
{
    // No column is generated for this value
    @EmbeddedId
    lateinit var id: LockDatabaseRecordKeyId

    @MapsId("databaseRecordId")
    @ManyToOne(targetEntity = LockDatabaseRecord::class, fetch = FetchType.LAZY, cascade = [CascadeType.PERSIST, CascadeType.REMOVE])
    @JoinColumn(name = "database_record_id", referencedColumnName = "id", insertable = false, updatable = false)
    @JsonIgnore
    lateinit var lockDatabaseRecord: LockDatabaseRecord

    @MapsId("keyId")
    @ManyToOne(targetEntity = Key::class, fetch = FetchType.LAZY, cascade = [CascadeType.PERSIST, CascadeType.REMOVE])
    @JoinColumn(name = "key_id", referencedColumnName = "id", insertable = false, updatable = false)
    @JsonIgnore
    lateinit var key: Key

    @ManyToOne(targetEntity = Lock::class, fetch = FetchType.LAZY, cascade = [CascadeType.PERSIST, CascadeType.REMOVE])
    @JsonIgnore
    lateinit var lock: Lock
 

По какой-то причине он создает таблицу lock_database_record_lock_database_record_keys

Ответ №1:

Я думаю, вы забыли сделать пометки @OneToMany(mappedBy = "lockDatabaseRecord") на lockDatabaseRecordKeys: Set<LockDatabaseRecordKey> поле в LockDatabaseRecord .