Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 休眠连接列而不是通过主键引用_Java_Mysql_Hibernate_Jpa - Fatal编程技术网

Java 休眠连接列而不是通过主键引用

Java 休眠连接列而不是通过主键引用,java,mysql,hibernate,jpa,Java,Mysql,Hibernate,Jpa,我有很多关系的用户和角色类。当我将角色对象添加到用户对象中的角色列表时,“用户角色”表列“用户名”和“角色名称”将填充用户和角色对象主键,它们是它们的ID。我想知道是否可以不引用主键(ID),而是在这些列中获取username和Role.name @Entity @Table(name = "users") @SecondaryTable(name = "user_info", pkJoinColumns = { @PrimaryKeyJoinColumn(name = "info_id", r

我有很多关系的用户和角色类。当我将角色对象添加到用户对象中的角色列表时,“用户角色”表列“用户名”和“角色名称”将填充用户和角色对象主键,它们是它们的ID。我想知道是否可以不引用主键(ID),而是在这些列中获取username和Role.name

@Entity
@Table(name = "users")
@SecondaryTable(name = "user_info", pkJoinColumns = {
@PrimaryKeyJoinColumn(name = "info_id", referencedColumnName = "user_id") })
public class User {

@Id
@Column(name = "user_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;

@Column(name = "username")
private String username;

@Column(name = "password")
private String password;

@ManyToMany 
@JoinTable(name="user_roles",
            joinColumns= {@JoinColumn(name="username"/*, referencedColumnName="username"*/)},
            inverseJoinColumns= {@JoinColumn( name="role_name"/*, referencedColumnName="role_name"*/)}
)
private List<Role> roles;

@Entity
@Table(name = "roles")
public class Role {

@Id
@Column(name = "role_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;

@Column(name = "role_name")
private String name;

@ManyToMany
private List<User> users;
@实体
@表(name=“users”)
@SecondaryTable(name=“user\u info”,pkJoinColumns={
@PrimaryKeyJoinColumn(name=“info\u id”,referencedColumnName=“user\u id”)})
公共类用户{
@身份证
@列(name=“user\u id”)
@GeneratedValue(策略=GenerationType.IDENTITY)
私有int-id;
@列(name=“username”)
私有字符串用户名;
@列(name=“password”)
私有字符串密码;
@许多
@JoinTable(name=“用户角色”,
joinColumns={@JoinColumn(name=“username”/*,referencedColumnName=“username”*/)},
inverseJoinColumns={@JoinColumn(name=“role\u name”/*,referencedColumnName=“role\u name”*/)}
)
私有列表角色;
@实体
@表(name=“roles”)
公共阶级角色{
@身份证
@列(name=“role\u id”)
@GeneratedValue(策略=GenerationType.IDENTITY)
私有int-id;
@列(name=“role\u name”)
私有字符串名称;
@许多
私人名单用户;
此外,如果删除referencedColumnName周围的注释,则在尝试从数据库中获取所有用户时会出现错误。我尚未向数据库添加任何数据,因此即使在查询空数据库时也会出现以下错误:

原因:org.hibernate.HibernateException:找到共享引用 到集合:com.recipee.model.User.roles


我之所以使用这样的数据库模式,是因为我试图使用Tomcat领域身份验证,在一个数据库表中需要用户名和角色名。

错误消息表明您在两个不同的用户中共享相同的角色列表。您正在这样做吗?如果是,不要这样做。@jbnizenot我不这么认为。我所做的只是调用listUsers()方法,该方法对数据库的查询如下:
List userList=session.createQuery(“from User”).List();
错误消息表明您在两个不同的用户中共享相同的角色列表。您正在这样做吗?如果是,请不要这样做。@JBNizet我不这样认为。我所做的只是调用listUsers()对数据库进行查询的方法如下:
List userList=session.createQuery(“来自用户”).List();