2013-05-30 8 views
0

Я хочу использовать карту в @ OneToMany, но он бросает исключениеHibernate mappedby составного ключа

org.hibernate.MappingException: Unable to read the mapped by attribute for moduleRoles in org.caau.entity.UserModuleRole! 

И вот моя сущность mapping.UserModuleRole составного использование class.if комментарий код, программа correct.Does кто-нибудь поможет мне решить?

@Entity 
@Table(name = "user") 
public class User{ 
    private long id; 
    private Set<UserModuleRole> moduleRoles; 

    @Id 
    @Column(name = "id", nullable = false) 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    public long getId() { 
     return id; 
    } 

    @OneToMany(fetch = FetchType.EAGER,mappedBy="user") 
    //if use under code,program is correct,but i want to use mappedBy! 
    //@OneToMany(fetch = FetchType.EAGER) 
    //@JoinColumn(name = "user_id") 
    public Set<UserModuleRole> getModuleRoles() { 
     return moduleRoles; 
    } 

} 

здесь класс UserModuleRole

@Entity 
    @Table(name = "user_module_role") 
    @IdClass(UserModuleRolePK.class) 
     public class UserModuleRole{ 
     private User user; 
     private ModuleRole moduleRole; 
     private long addUserId; 
     private Date addDate; 
     private long updateUserId; 
     private Date updateDate; 

     @Id 
     public User getUser() { 
      return user; 
     } 

     @Id 
     public ModuleRole getModuleRole() { 
      return moduleRole; 
     } 
    } 
    class UserModuleRolePK implements Serializable { 

     private static final long serialVersionUID = -9132981262254922539L; 

     private User user; 
     private ModuleRole moduleRole; 

     @ManyToOne 
     @JoinColumn(name = "user_id", nullable = false) 
     public User getUser() { 
      return user; 
     } 

     @ManyToOne 
     @JoinColumns({ @JoinColumn(name = "module_id", nullable = false), @JoinColumn(name = "role_id", nullable = false) }) 
     public ModuleRole getModuleRole() { 
      return moduleRole; 
     } 
    } 
    } 

ответ

1

Во-первых, исключение вы получаете из-за того, что там нет никакого реляционная атрибут с именем user в вашем UserModuleRole классе.

То, что вы пытаетесь достичь является Многие-ко-многим отношения между вашими субъектами User и ModuleRole, посреднической класса UserModuleRole не нужен в вашем примере в качестве единственных полей/свойств он владеет являются ссылки на внешние ключи к двум другим объектам.

Если вы не забыли добавить более подробную информацию на ваш вопрос, отображение вы должны использовать гораздо проще, чем-то вроде следующего:

@Entity 
public class ModuleRole { 

    private Long id; 

    private Set<User> users; 

    @Id 
    @Column(name = "id") 
    public Long getId() { 
     return id; 
    } 

    @ManyToMany 
    @JoinTable(name = "user_module_role", 
     joinColumns = @JoinColumn(name = "module_id", referencedColumnName = "id"), 
     inverseJoinColumns = @JoinColumn(name = "user_id"), referencedColumnName = "id") 
    public Set<Users> getUsers() { 
     return users; 
    } 

} 

@Entity 
@Table(name = "user") 
public class User{ 
    private Long id; 
    private Set<ModuleRole> moduleRoles; 

    @Id 
    @Column(name = "id", nullable = false) 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    public long getId() { 
     return id; 
    } 

    @ManyToMany(mappedBy = "users") 
    public Set<ModuleRole> getModuleRoles() { 
     return moduleRoles; 
    } 

} 

Hibernate будет иметь дело с посреднической таблицы самостоятельно, вы не» t нужно беспокоиться об этом, если вы не хотите добавлять дополнительные поля в отношения, в этом случае this tutorial поможет.

+0

но мой user_module_role имел другое поле создать таблицу user_module_role ( \t user_id INT без знака не равно нулю, \t MODULE_ID ИНТ без знака не равно нулю, \t role_id ИНТ без знака не равно нулю, \t add_user_id INT неподписанных по умолчанию 1, add_date даты и времени по умолчанию '1970/01/01', update_user_id int unsigned default 1, update_date datetime default '1970/01/01'); –

+0

Вы проверили ссылку на учебник, который я поставил в конце ответа? –

Смежные вопросы