Внешний ключ «один ко многим» должен иметь такое же количество столбцов, что и первичный ключ, на который есть ссылка - PullRequest
0 голосов
/ 08 марта 2019

Я пытаюсь реализовать связь «один ко многим» между заказом и продуктом заказа, и я всегда сталкиваюсь с этим исключением:

Foreign key (FKmn6eaqdlnl33lnryjkwu09r0m:order_product_entity [order_id,product_id])) must have same number of columns as the referenced primary key (orders [id])

Я знаю, что это значит, но я не уверен, как мне следует изменитьмоя схема, чтобы решить это.Мой дизайн основан на этом уроке: Spring Java ECommerce Tutorial

Я не могу сказать разницу, за исключением того, что мой код написан на Kotlin.

Я использую Spring Bootс данными Spring JPA и Kotlin.

Мой товар:

@Entity
@Table(name = "product")
data class ProductEntity(
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        var id: Long,
        @NotNull(message = "Product name is required")
        var name: String,
        var price: Double,
        var description: String

)

Мой заказ:

@Entity
@Table(name = "orders")
data class OrderEntity(
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        var id:Long,

        var dateCreated:Date,

        var status:String,

        @JsonManagedReference
        @OneToMany(cascade = arrayOf(CascadeType.ALL), mappedBy = "orderProductEntityId")
        @Valid
        val orderProducts: List<OrderProductEntity>
)

OrderProductEntity:

@Entity
data class OrderProductEntity(
        @EmbeddedId
        @JsonIgnore
        var orderProductEntityId: OrderProductEntityId,

        @JsonBackReference
        @ManyToOne(optional = false, fetch = FetchType.LAZY)
        var order: OrderEntity,

        @ManyToOne(optional = false, fetch = FetchType.LAZY)
        var product: ProductEntity,

        @Column(nullable = false)
        var quantity: Int = 0
)

Мой составной первичный ключ:

@Embeddable
data class OrderProductEntityId(
        @Column(name = "order_id")
        var orderId: Long = 0,

        @Column(name = "product_id")
        var productId: Long = 0
) : Serializable

Есть предложения?

1 Ответ

0 голосов
/ 09 марта 2019

Я полагаю, что вы используете "производные идентификационные данные". Попробуйте сопоставить OrderProductEntity так:

@Entity
data class OrderProductEntity(
    @EmbeddedId
    @JsonIgnore
    var orderProductEntityId: OrderProductEntityId,

    @JsonBackReference
    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    @MapsId("orderId") // maps orderId attribute of embedded id
    var order: OrderEntity,

    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    @MapsId("productId") // maps productId attribute of embedded id
    var product: ProductEntity,

    @Column(nullable = false)
    var quantity: Int = 0
)

Обратите внимание на новые @MapsId аннотации.

Производные идентификаторы обсуждаются (с примерами) в спецификации JPA 2.2 в разделе 2.4.1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...