Java Hibernate mappedby复合键
我想在@OneToMany中使用mapped,但它会引发异常Java Hibernate mappedby复合键,java,hibernate,jpa,Java,Hibernate,Jpa,我想在@OneToMany中使用mapped,但它会引发异常 org.hibernate.MappingException: Unable to read the mapped by attribute for moduleRoles in org.caau.entity.UserModuleRole! 这是我的实体映射。UserModuleRole是复合类。若使用注释代码,程序是正确的。有人帮我解决吗 @Entity @Table(name = "user") public class Us
org.hibernate.MappingException: Unable to read the mapped by attribute for moduleRoles in org.caau.entity.UserModuleRole!
这是我的实体映射。UserModuleRole是复合类。若使用注释代码,程序是正确的。有人帮我解决吗
@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
类中没有任何名为user
的关系属性
您试图实现的是实体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;
}
}
@实体
公共类模块{
私人长id;
私人用户;
@身份证
@列(name=“id”)
公共长getId(){
返回id;
}
@许多
@JoinTable(name=“用户\模块\角色”,
joinColumns=@JoinColumn(name=“module\u id”,referencedColumnName=“id”),
inverseJoinColumns=@JoinColumn(name=“user\u id”),referencedColumnName=“id”)
公共集getUsers(){
返回用户;
}
}
@实体
@表(name=“user”)
公共类用户{
私人长id;
私有集模块;
@身份证
@列(name=“id”,nullable=false)
@GeneratedValue(策略=GenerationType.AUTO)
公共长getId(){
返回id;
}
@多人(mappedBy=“用户”)
公共集getModuleRoles(){
返回模块;
}
}
Hibernate将自己处理中间表,您不必担心它,除非您想向关系中添加其他字段,这样会有所帮助。但是我的用户模块角色有其他字段创建表用户模块角色(user_id int unsigned not null,module_id int unsigned not null,role_id int unsigned not null,add_user_id int unsigned default 1,add_date datetime default'1970/01/01',update_user_id int unsigned default 1,update_date datetime default'1970/01/01');您是否检查了我在答案末尾添加的教程链接?
@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;
}
}