При использовании одного и того же имени столбца для двух разных таблиц, связанных через связь ManyToOne, создается дополнительный столбец - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть проект SpringBoot с Spring Data.Дополнительный столбец создается, когда я использую одно и то же имя столбца для 2 таблиц, сопоставленных с помощью ManyToOne Relation.У меня есть таблица адресов с именем столбца "id" и таблица AddressType с именем столбца "id".Когда я запускаю приложение Spring Boot с этим, я вижу дополнительный столбец (address_id), созданный в таблице адресов.

Address.java

package com.springtesting.model;

import lombok.Data;

import javax.persistence.*;

@Entity
@Data
@Table(name = "address")
public class Address
{

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;

    @Column(name = "street_name")
    private String streetName;

    @Column(name = "apartment")
    private String apartment;

    @Column(name = "city")
    private String city;

    @Column(name = "state")
    private String state;

    @Column(name = "country")
    private String country;

    @Column(name = "zip_code")
    private String zipCode;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "address_type_id")
    private AddressType addressType;

    public Address()
    {
    }

    public Address(String streetName, String apartment, String city, String state, String country, String zipCode, AddressType addressType)
    {
        this.streetName = streetName;
        this.apartment = apartment;
        this.city = city;
        this.state = state;
        this.country = country;
        this.zipCode = zipCode;
        this.addressType = addressType;
    }
}

и

AddressType.Java

package com.springtesting.model;

import lombok.Data;
import lombok.NonNull;

import javax.persistence.*;

@Entity
@Data
@Table(name = "address_type")
public class AddressType
{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;

    @Column(name = "type")
    @NonNull
    private String type;

    public AddressType()
    {

    }

    public AddressType(String type)
    {
    }
}

когда я запускаю приложение Spring Boot, я вижу дополнительный столбец (address_id)

Структура таблицы на Mysql

1 Ответ

0 голосов
/ 15 ноября 2018

Я не уверен, что это решит вашу проблему, но попробуйте изменить @GeneratedValue(strategy = GenerationType.AUTO) на @GeneratedValue(strategy = GenerationType.IDENTITY) или дать ему "родной" GenericGenerator, как обсуждалось здесь . Очевидно, GenerationType.AUTO не очень хорошо работает с MySQL из Hibernate 5+.

Пара других заметок:

  • Вы, вероятно, не хотите использовать @NonNull Lombok, вместо этого просто используйте @Column(name = "type", nullable = false). Фактически, если POJO создается с помощью конструктора по умолчанию, @NonNull Ломбока ничего не сделает в любом случае , поскольку он аннотирован над полем.

  • Вам не нужен cascade = CascadeType.ALL над AddressType, поскольку вы, вероятно, не хотите случайно обновлять / удалять / создавать новые AddressType s с помощью сущности Address. Достаточно просто пометить его @ManyToOne.

...