Pavan Jadda
Pavan Jadda

Reputation: 4891

Extra column being created when I use same column name for two different tables connected through ManyToOne relationship

I have SpringBoot project with Spring Data. Extra column being created when I use the same column name for 2 tables mapped using ManyToOne Relation. I have Address table with column name 'id' and AddressType table with column 'id'. When I start the Spring Boot application with this, I see an extra column (address_id) created on Address table.

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;
    }
}

and

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)
    {
    }
}

when I start the Spring Boot application, I see extra column (address_id)

Table Structure on Mysql

Upvotes: 0

Views: 465

Answers (1)

dyslexit
dyslexit

Reputation: 783

I'm not sure this will fix your issue, but try changing the @GeneratedValue(strategy = GenerationType.AUTO) to @GeneratedValue(strategy = GenerationType.IDENTITY), or give it a "native" GenericGenerator, as discussed here. Apparently GenerationType.AUTO does not play nice with MySQL from Hibernate 5+.

A couple of other notes:

  • You probably don't want to use Lombok's @NonNull, instead just use @Column(name = "type", nullable = false). In fact if the POJO is created through the default constructor, Lombok's @NonNull wouldn't do anything anyway since it's annotated over a field.

  • You don't need the cascade = CascadeType.ALL above the AddressType since you probably don't want to accidentally update/delete/or create new AddressTypes through the Address entity. Just annotating it @ManyToOne should be enough.

Upvotes: 0

Related Questions