MappedBy refers to an unknown property of the target entity - hibernate error

first, my classes:

User

package com.patpuc.model; import java.util.List; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.OneToMany; import javax.persistence.Table; import com.patpuc.model.RolesMap; @Entity @Table(name = "users") public class User { @Id @Column(name = "USER_ID", unique = true, nullable = false) private int user_id; @Column(name = "NAME", nullable = false) private String name; @Column(name = "SURNAME", unique = true, nullable = false) private String surname; @Column(name = "USERNAME_U", unique = true, nullable = false) private String username_u; // zamiast username @Column(name = "PASSWORD", unique = true, nullable = false) private String password; @Column(name = "USER_DESCRIPTION", nullable = false) private String userDescription; @Column(name = "AUTHORITY", nullable = false) private String authority = "ROLE_USER"; @Column(name = "ENABLED", nullable = false) private int enabled; @OneToMany(mappedBy = "rUser") private List<RolesMap> rolesMap; public List<RolesMap> getRolesMap() { return rolesMap; } public void setRolesMap(List<RolesMap> rolesMap) { this.rolesMap = rolesMap; } /** * @return the user_id */ public int getUser_id() { return user_id; } /** * @param user_id * the user_id to set */ public void setUser_id(int user_id) { this.user_id = user_id; } /** * @return the name */ public String getName() { return name; } /** * @param name * the name to set */ public void setName(String name) { this.name = name; } /** * @return the surname */ public String getSurname() { return surname; } /** * @param surname * the surname to set */ public void setSurname(String surname) { this.surname = surname; } /** * @return the username_u */ public String getUsername_u() { return username_u; } /** * @param username_u * the username_u to set */ public void setUsername_u(String username_u) { this.username_u = username_u; } /** * @return the password */ public String getPassword() { return password; } /** * @param password * the password to set */ public void setPassword(String password) { this.password = password; } /** * @return the userDescription */ public String getUserDescription() { return userDescription; } /** * @param userDescription * the userDescription to set */ public void setUserDescription(String userDescription) { this.userDescription = userDescription; } /** * @return the authority */ public String getAuthority() { return authority; } /** * @param authority * the authority to set */ public void setAuthority(String authority) { this.authority = authority; } /** * @return the enabled */ public int getEnabled() { return enabled; } /** * @param enabled * the enabled to set */ public void setEnabled(int enabled) { this.enabled = enabled; } @Override public String toString() { StringBuffer strBuff = new StringBuffer(); strBuff.append("id : ").append(getUser_id()); strBuff.append(", name : ").append(getName()); strBuff.append(", surname : ").append(getSurname()); return strBuff.toString(); } } 

RolesMap.java

 package com.patpuc.model; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table; import com.patpuc.model.User; @Entity @Table(name = "roles_map") public class RolesMap { private int rm_id; private String username_a; private String username_l; //private String username_u; private String password; private int role_id; @ManyToOne @JoinColumn(name="username_u", nullable=false) private User rUser; public RolesMap(){ } /** * @return the user */ public User getUser() { return rUser; } /** * @param user the user to set */ public void setUser(User rUser) { this.rUser = rUser; } @Id @Column(name = "RM_ID", unique = true, nullable = false) public int getRmId() { return rm_id; } public void setRmId(int rm_id) { this.rm_id = rm_id; } @Column(name = "USERNAME_A", unique = true) public String getUsernameA() { return username_a; } public void setUsernameA(String username_a) { this.username_a = username_a; } @Column(name = "USERNAME_L", unique = true) public String getUsernameL() { return username_l; } public void setUsernameL(String username_l) { this.username_l = username_l; } @Column(name = "PASSWORD", unique = true, nullable = false) public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Column(name = "ROLE_ID", unique = true, nullable = false) public int getRoleId() { return role_id; } public void setRoleId(int role_id) { this.role_id = role_id; } } 

when I try to run this on the server, I have this exception: Error creating a bean with the name "SessionFactory" defined in the ServletContext resource [/WEB-INF/classes/baseBeans.xml]: the init method call failed; The nested exception is org.hibernate.AnnotationException: mappedBy refers to an unknown property of the target entity: com.patpuc.model.RolesMap.users in com.patpuc.model.User.rolesMap

But I do not understand what I am doing wrong. Can someone help me solve this problem?

+7
java spring mapping hibernate jpa
source share
1 answer

By default, when you define your object, you can use access based on a field or property, but not both. "Access type" basically means that your JPA provider is trying to determine the state of your object. If field access is used, it looks at instance variables. If access to a resource is used, it looks at the recipients.

In your case, you did not explicitly specify the type of access, so JPA tries to figure it out by looking where you posted your annotations. I think Hibernate decides based on the placement of the @Id annotation. Since your @Id annotation is placed on a getter, Hibernate uses property-based access for RolesMap .

With property-based access, you do not have a property named rUser because you do not have a recipient named getRUser() .

The spec states that you should not mix your annotation layout:

All such classes in the hierarchy of entities whose access type defaulted in this way must be consistent in their placement of annotations over any fields or properties, so that one, consistent access type is used by default in the hierarchy

What I propose to do to solve the problem:

Place your annotations sequentially so that there is no ambiguity (for example, always add your annotations to instance variables). This will result in the following changes to RolesMap :

 @Entity @Table(name = "roles_map") public class RolesMap { @Id @Column(name = "RM_ID", unique = true, nullable = false) private int rm_id; @Column(name = "USERNAME_A", unique = true) private String username_a; @Column(name = "USERNAME_L", unique = true) private String username_l; @Column(name = "PASSWORD", unique = true, nullable = false) private String password; @Column(name = "ROLE_ID", unique = true, nullable = false) private int role_id; @ManyToOne @JoinColumn(name="username_u", nullable=false) private User rUser; // ... constructor(s), getters/setters, etc ... } 
+11
source share

All Articles