2017-03-22 5 views
0

StackOverflowにはこれに関する多くの質問があります。しかし、私はまだそれを解決することはできません。 私はHibernateを永続性レイヤーとして使用して税制をコーディングしています。 今、私は2つのエンティティクラス、 Role.javaとRolePrivilege.javaを持っています。 これは、これはRolePrivilege.javaあるRole.javaHibernate AnnotationException:mappedBy reference

package com.taxsys.nsfw.role.entity; 

import java.io.Serializable; 
import java.util.HashSet; 
import java.util.Set; 

import javax.persistence.CascadeType; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.FetchType; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Id; 
import javax.persistence.OneToMany; 
import javax.persistence.Table; 

import org.hibernate.annotations.GenericGenerator; 
@Entity 
@Table(name="role") 
public class Role implements Serializable{ 

    @Id 
    @GenericGenerator(name="pk_hilo", strategy="hilo") 
    @GeneratedValue(generator="pk_hilo") 
    @Column(name="role_id") 
    private String roleId; 

    @Column(name="role_name",length=32, nullable=false) 
    private String roleName; 

    @Column(name="state", length=1) 
    private String state; 

    @OneToMany(targetEntity=RolePrivilege.class, 
    mappedBy="role", cascade=CascadeType.ALL, 
    fetch=FetchType.EAGER) 
    private Set<RolePrivilege> role = new HashSet<>(); 


    public static String ROLE_STATE_VALID = "1"; 
    public static String ROLE_STATE_INVALID = "0"; 


    public Set<RolePrivilege> getRolePrivilege() { 
     return role; 
    } 
    public void setRolePrivilege(Set<RolePrivilege> rolePrivilege) { 
     this.role = rolePrivilege; 
    } 
    public String getRoleId() { 
     return roleId; 
    } 
    public void setRoleId(String roleId) { 
     this.roleId = roleId; 
    } 
    public String getRoleName() { 
     return roleName; 
    } 
    public void setRoleName(String roleName) { 
     this.roleName = roleName; 
    } 
    public String getState() { 
     return state; 
    } 
    public void setState(String state) { 
     this.state = state; 
    } 
    public Role() { 
    } 
    public Role(String roleId, String roleName, String state, Set<RolePrivilege> rolePrivilege) { 
     super(); 
     this.roleId = roleId; 
     this.roleName = roleName; 
     this.state = state; 
     this.role = rolePrivilege; 
    } 
} 

です:

package com.taxsys.nsfw.role.entity; 

import java.io.Serializable; 

import javax.persistence.Entity; 
import javax.persistence.FetchType; 
import javax.persistence.Id; 
import javax.persistence.JoinColumn; 
import javax.persistence.ManyToOne; 
import javax.persistence.Table; 

@Entity 
@Table(name="role_privilege") 
public class RolePrivilege implements Serializable{ 

    @ManyToOne(targetEntity=Role.class, fetch=FetchType.EAGER) 
    @JoinColumn(name="role_id", referencedColumnName="role_id") 
    @Id 
    private Role role; 

    @Id 
    private String code; 

    public RolePrivilege(Role role, String code) { 
     super(); 
     this.role = role; 
     this.code = code; 
    } 

    public RolePrivilege() { 
    } 

    public Role getRole() { 
     return role; 
    } 

    public void setRole(Role role) { 
     this.role = role; 
    } 

    public String getCode() { 
     return code; 
    } 

    public void setCode(String code) { 
     this.code = code; 
    } 

    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + ((code == null) ? 0 : code.hashCode()); 
     result = prime * result + ((role == null) ? 0 : role.hashCode()); 
     return result; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     RolePrivilege other = (RolePrivilege) obj; 
     if (code == null) { 
      if (other.code != null) 
       return false; 
     } else if (!code.equals(other.code)) 
      return false; 
     if (role == null) { 
      if (other.role != null) 
       return false; 
     } else if (!role.equals(other.role)) 
      return false; 
     return true; 
    } 

} 

私はHibernate3.6、spring3.0、struts2.3とtomcat7を使用しています。 しかし、lはTomcatを起動したときに、エラーメッセージが表示されます。

Caused by: org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: com.taxsys.nsfw.role.entity.RolePrivilege.role in com.taxsys.nsfw.role.entity.Role.role 

は私のコードを見て! mappedBy = "role"。RolePrivilege.roleと同じです!また、小文字を使用しても動作しません!どうしてか分かりません。たぶんそれは瓶や互換性に関する質問ですか?ありがとうございました!

+0

RolePrivilegeのrole_idが主キーの一部である必要がありますか。 –

+0

targetEntityアノテーションを削除しようとしましたか?同じエラーですか? –

+0

は、ロールオブジェクトとコード(String)を複合キーと見なします。 role_idではなく、注意を払うことはRoleオブジェクトです。それはそうです?私は本を​​読んでいる、本はその方法を言及する。 –

答えて

0

private Role role;ためRolePrivilege.javaに@Idを取り外し、uはまだあなたがマップするために@ManyToOneマッピングを使用し、その後、新しいクラスのオブジェクトに@Embeddableのアノテーションを使用して複合キーをマップすることができ

+0

ありがとうございます!問題はありません!しかし私は質問があります。つまり、RolePrivilegeでは、役割とコードを複合キーとして使用したいのですが、どうすればよいですか?私のRolePrivilege.javaを見てください。私はロールとコードの2つの@Idユーザーが、それはエラーです!他の方法? –

+0

私の答えを受け入れる場合はそれを受け入れます。 複合キーについて、あなたのアプローチは間違っています、manyToMany関係でキーを設定する方法を見てください、それは同じ概念を使用します – cimecut

関連する問題