0

I am using in my project JPA embedded entities.

I have this embeddable class

@Embeddable
public class Address {

private String addressLine1;
private String addressLine2;
private String city;
private String state;
private String zipCode;

public String getAddressLine1() {
    return addressLine1;
}

public void setAddressLine1(String addressLine1) {
    this.addressLine1 = addressLine1;
}

public String getAddressLine2() {
    return addressLine2;
}

public void setAddressLine2(String addressLine2) {
    this.addressLine2 = addressLine2;
}

public String getCity() {
    return city;
}

public void setCity(String city) {
    this.city = city;
}

public String getState() {
    return state;
}

public void setState(String state) {
    this.state = state;
}

public String getZipCode() {
    return zipCode;
}

public void setZipCode(String zipCode) {
    this.zipCode = zipCode;
 }

}

And I am embedding this class in here

@Entity
public class Customer implements   
DomainObject{

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;

@Version
private Integer version;

private String firstName;
private String lastName;
private String email;
private String phoneNumber;

@Embedded
private Address billingAddress;

@Embedded
private Address shippingAddress;

@OneToOne
private User user;

@Override
public Integer getId() {
    return id;
}

@Override
public void setId(Integer id) {
    this.id = id;
}

public Integer getVersion() {
    return version;
}

public void setVersion(Integer version) {
    this.version = version;
}

public String getFirstName() {
    return firstName;
}

public void setFirstName(String firstName) {
    this.firstName = firstName;
}

public String getLastName() {
    return lastName;
}

public void setLastName(String lastName) {
    this.lastName = lastName;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public String getPhoneNumber() {
    return phoneNumber;
}

public void setPhoneNumber(String phoneNumber) {
    this.phoneNumber = phoneNumber;
}

public User getUser() {
    return user;
}

public void setUser(User user) {
    this.user = user;
}

public Address getBillingAddress() {
    return billingAddress;
}

public void setBillingAddress(Address billingAddress) {
    this.billingAddress = billingAddress;
}

public Address getShippingAddress() {
    return shippingAddress;
}

public void setShippingAddress(Address shippingAddress) {
    this.shippingAddress =     shippingAddress;
}
}

After running the project I am this is error

Repeated column in mapping entity:
theo.tziomakas.udemy.domain.Customer column: billing_address_line1 (should be mapped with insert = "false" update = "false"

You can clone my project if you want and check it yourself.

I have also tried this answer but didn't get anything.

UPDATE

I solved this error by using the AttributeOverride annotation.

@Embedded
@AttributeOverrides({
        @AttributeOverride( name = "addressLine1",
        column = @Column(name = "billing_address_line1")
        ),
        @AttributeOverride( name = "addressLine2",
                column = @Column(name = "billing_address_line2")
        ),
        @AttributeOverride( name = "city",
                column = @Column(name = "billing_city")
        ),
        @AttributeOverride( name = "state",
                column = @Column(name = "billing_state")
        ),
        @AttributeOverride( name = "zipCode",
                column = @Column(name = "billing_zip_code")
        )
})
private Address billingAddress;

@Embedded
@AttributeOverrides({
        @AttributeOverride( name = "addressLine1",
                column = @Column(name = "shipping_address_line1")
        ),
        @AttributeOverride( name = "addressLine2",
                column = @Column(name = "shipping_address_line2")
        ),
        @AttributeOverride( name = "city",
                column = @Column(name = "shipping_city")
        ),
        @AttributeOverride( name = "state",
                column = @Column(name = "shipping_state")
        ),
        @AttributeOverride( name = "zipCode",
                column = @Column(name = "shipping_zip_code")
        )
})
private Address shippingAddress;
Theo
  • 3,099
  • 12
  • 53
  • 94
  • Can you post your Database Schema? – Phenomenal One Sep 14 '18 at 05:07
  • @Maruthi Adithya. Is this necessary? I can't at the moment. – Theo Sep 14 '18 at 05:13
  • How do you store `billingAddress` in your Database? Is it flat or is it a JSON? Also, if it is flat, what are the database column names you have assigned to it? Is it the exact same as `Address`? – Phenomenal One Sep 14 '18 at 05:17
  • @Maruthi Adithya. Ιt's flat. Yes the columns are the same as Address. – Theo Sep 14 '18 at 05:19
  • @Maruthi Adithya. But right now I store nothing, as I get the described exception. But you can clone and run the project to have a better idea! – Theo Sep 14 '18 at 05:20
  • Ok it's fixed now. I will post the answer later in the evening. Thank you for spending some time for helping solve this problem. – Theo Sep 14 '18 at 06:16

1 Answers1

3

So I cloned your repository and found that the problem arises because you have Embedded Address 2 times - shippingAddress and billingAddress in Customer.java . I would recommend the using @AttributeOverride annotation to solve this issue. See this thread.

Change the Entity Fields like this.

@Embedded
@AttributeOverrides({
    @AttributeOverride(name="addressLine1",column=@Column(name="billingAddressLine1")),
    @AttributeOverride(name="addressLine2",column=@Column(name="billingAddressLine2")),
    @AttributeOverride(name="city",column=@Column(name="billingCity")),
    @AttributeOverride(name="state",column=@Column(name="billingState")),
    @AttributeOverride(name="zipCode",column=@Column(name="billingZipCode")),
})
private Address billingAddress;

@Embedded
@AttributeOverrides({
    @AttributeOverride(name="addressLine1",column=@Column(name="shippingAddressLine1")),
    @AttributeOverride(name="addressLine2",column=@Column(name="shippingAddressLine2")),
    @AttributeOverride(name="city",column=@Column(name="shippingCity")),
    @AttributeOverride(name="state",column=@Column(name="shippingState")),
    @AttributeOverride(name="zipCode",column=@Column(name="shippingZipCode")),
})
private Address shippingAddress;
Phenomenal One
  • 2,501
  • 4
  • 19
  • 29