当前位置: 首页 > 知识库问答 >
问题:

Hibernate和spring mvc中实体的双向映射

尤博达
2023-03-14

我的用户实体:

@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)
@JoinTable(
        name="UserRole",
        joinColumns = @JoinColumn(name="USER_ID"),
        inverseJoinColumns = @JoinColumn(name="ROLE_ID")
)
public Set<Role> role;

我的角色实体:

@ManyToOne(cascade = CascadeType.ALL)
@JoinTable(
        name="UserRole",
        joinColumns= @JoinColumn(name="ROLE_ID")
)
private User user;

现在,在数据库中创建的相应中间表具有以下属性。

@ManyToOne(cascade = CascadeType.ALL)
@JoinTable(
        name="UserRole",
        joinColumns = @JoinColumn(name = "ROLE_ID"),
        inverseJoinColumns = @JoinColumn(name="USER_ID")
)
private User user;

共有1个答案

罗烨霖
2023-03-14

user实体中,您已经用role声明了@onetomany,并使用@jointable给出了有关联接表的详细信息。

因此,如果需要UserRole实体之间的双向,那么在Role实体中添加User属性和@manytoone声明就足够了,因此无需再次使用@jointable

现在来看user_userid-在role实体中,您已经声明了@jointable注释,该注释需要两个列名用于联接表。

@JoinTable(
        name="JoinTableName",
        joinColumns = @JoinColumn(name="ID_NAME_FOR_THIS_ENTITY"),
        inverseJoinColumns = @JoinColumn(name="ID_NAME_FOR_THE_MAPPING_ENTITY")
)

但是您提供了一个名称为role_id的名称,忽略了第二个名称,即InverseJoinColumns,它指向User实体。

@JoinTable(
        name="UserRole",
        joinColumns= @JoinColumn(name="ROLE_ID")
)

所以hibernate应该猜测InverseJoinColumns的列名,所以它创建一个列,该列的名称是小写的实体名称(在您的例子中是User)和由下划线分隔的实体标识符(我猜是UserID,基于列名)的组合。因此,最后列名变成user_userid

更新:

如果您需要双向关系,那么您需要像这样声明您的实体:

@OneToMany(mappedBy="user", cascade=CascadeType.ALL,fetch=FetchType.EAGER)
public Set<Role> role;

这里告诉hibernateUser实体与Role实体具有一对多关系,这种关系是双向的,Role实体具有一个名为User的属性。

现在,在您的角色实体中,您将提供关于可连接的详细信息,如下所示:

@ManyToOne(cascade = CascadeType.ALL)
@JoinTable(
        name="UserRole",
        joinColumns = @JoinColumn(name="ROLE_ID"),
        inverseJoinColumns = @JoinColumn(name="USER_ID")
)
private User user;
 类似资料:
  • 我有两张桌子。后 和喜欢 在这些对象之间进行hibernate注释映射,以便在类似于Post bean的。。。。 就像豆子一样 问题 该关联是否由Post{@OneToOne}和like{@ManyToOne}正确? 获取类型是Lazy,但仍然得到依赖循环。为什么? 尝试 要删除依赖关系循环,我尝试了 {@xmltransive} {@JsonIgnore} {@JsonManagedRefere

  • Hi编写Spring应用程序,使用Spring Security。这是我的用户和帐户角色数据库: 我的实体类: 当我尝试登录我的系统我有错误: Hibernate:选择userrolese0_. username作为username3_1_0_,userrolese0_. id作为id1_0_0_,userrolese0_. id作为id1_0_1_,userrolese0_. name作为nam

  • 问题内容: 映射双向列表时,我不了解Hibernate的行为。Hibernate生成的SQL语句对我来说并不是最佳的。有人可以启发我吗? 情况如下:我有一对多的父子关系。我将此关系与双向列表映射。 根据《Hibernate注释参考指南》(第7章:与索引集合的双向关联),映射应如下所示: 但是在这种情况下,Hibernate在保留一个孩子的父母时会产生三个SQL语句: 第三条语句似乎是多余的,因为并

  • 我在Kotlin-vertx项目中配置了Hibernate,我设法设置了所有内容,但当我运行HQL查询时,它会输出: 提前谢了。

  • 是否有可能不在HiberNate中的实体层次结构中间为类创建表? 我想指出某些实体是某种类型的子集,以便返回所有这些实体的集合,但我不会在此中间类型中放置任何额外的属性。因此,保留带有id字段的额外表只是为了连接表,这听起来并不好。 更好的解决方案是实现一些公共接口< code>CommonInterface,但是这样我就失去了返回< code>List的可能性

  • 1. 前言 通过本节课程的学习,你将发现关联对象之间的微妙关系。相信这种关系对你更深入地认识 HIbernate 有很大的帮助。 通过本节课程,你将了解到: 多对多双向关联映射中哪一方是关系维系者; 级联操作与关系维系者。 2. 关系维系者 新学期开始了,同学们选择了各自喜欢的课程,现在为学生添加选修课程的任务就要落在 Hibernate 的身上。一起来看看 Hibernate 是如何完成这个任务