Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JPA OneToMany and ManyToOne throw: Repeated column in mapping for entity column (should be mapped with insert="false" update="false")

I have three classes one of the names is User and this user has other classes instances. Like this;

public class User{     @OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL)     public List<APost> aPosts;      @OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL)     public List<BPost> bPosts; }        public class BPost extends Post {          @ManyToOne(fetch=FetchType.LAZY)         public User user;  }          public class APost extends Post {           @ManyToOne(fetch=FetchType.LAZY)       public User user;  } 

it's working like this but generates empty tables in DB. Which have to contain foreign keys. When I tried to use mappedBy and JoinColumn annotations I got failed. How can I resolve this?

Extra information:

When I changed with;

 @ManyToOne(fetch=FetchType.LAZY)  @JoinColumn(name="id")  public User user; 

and

 @OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL, mappedBy="id")  public List<APost> aPosts; 

I'm getting

A JPA error occurred (Unable to build EntityManagerFactory): Repeated column in mapping for entity: models.post.APost column: id (should be mapped with insert="false" update="false")

Final Edit: Finally, I was totally wrong about JPA annotations. :( When I change

@OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL, mappedBy="id") 

to

@OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL, mappedBy="user") 

and

@ManyToOne(fetch=FetchType.LAZY) @JoinColumn(name="user_id") 

everything works ok. :)

like image 737
Ömer Faruk AK Avatar asked Dec 11 '12 00:12

Ömer Faruk AK


People also ask

Can a JPA entity have multiple Onetomany associations?

You can have multiple one-to-many associations, as long as only one is EAGER.

What is difference between MappedBy and @JoinColumn?

The @JoinColumn annotation helps us specify the column we'll use for joining an entity association or element collection. On the other hand, the mappedBy attribute is used to define the referencing side (non-owning side) of the relationship.

What is MappedBy in JPA?

The purpose of the MappedBy parameter is to instruct JPA: Do NOT create another join table as the relationship is already being mapped by the opposite entity of this relationship.

What is MappedBy?

mappedby="object of entity of same class created in another class” Note:-Mapped by can be used only in one class because one table must contain foreign key constraint. if mapped by can be applied on both side then it remove foreign key from both table and without foreign key there is no relation b/w two tables.


1 Answers

I am not really sure about your question (the meaning of "empty table" etc, or how mappedBy and JoinColumn were not working).

I think you were trying to do a bi-directional relationships.

First, you need to decide which side "owns" the relationship. Hibernate is going to setup the relationship base on that side. For example, assume I make the Post side own the relationship (I am simplifying your example, just to keep things in point), the mapping will look like:

(Wish the syntax is correct. I am writing them just by memory. However the idea should be fine)

public class User{     @OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL, mappedBy="user")     private List<Post> posts; }   public class Post {     @ManyToOne(fetch=FetchType.LAZY)     @JoinColumn(name="user_id")     private User user; } 

By doing so, the table for Post will have a column user_id which store the relationship. Hibernate is getting the relationship by the user in Post (Instead of posts in User. You will notice the difference if you have Post's user but missing User's posts).

You have mentioned mappedBy and JoinColumn is not working. However, I believe this is in fact the correct way. Please tell if this approach is not working for you, and give us a bit more info on the problem. I believe the problem is due to something else.


Edit:

Just a bit extra information on the use of mappedBy as it is usually confusing at first. In mappedBy, we put the "property name" in the opposite side of the bidirectional relationship, not table column name.

like image 144
Adrian Shum Avatar answered Oct 06 '22 12:10

Adrian Shum