gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 07:50:07 24 4
gpt4 key购买 nike

我正在尝试映射两个实体用户(用户ID,名称,密码,地址)和角色(角色ID,角色名称)。我正在尝试在用户和角色之间进行双向 OneToMany 映射。

我的用户实体:

@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;

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

用户角色->属性( user_userId,ROLE_ID,USER_ID )

现在,当我向用户添加一组项目时。 userrole 表的 ROLE_ID 和 USER_ID 已填充,但 user_userId 仍为空。 user_userId的用途是什么。我是否应该手动将其设为user_userId表中的主键?

更新:

我在角色实体中进行了以下编辑

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

现在,当我检查数据库中的表时,“userrole”表完全正常并且仅包含(USER_ID,ROLE_ID)

我想知道为什么我不应该通过这种方式映射两个实体?

最佳答案

User您已声明的实体 @OneToManyRole还给出了有关使用 @JoinTable 连接表的详细信息.

所以如果你需要bidirectional之间UserRole实体,然后添加 user属性(property) Role实体 @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;

在这里你告诉 hibernate User实体与 Role 具有一对多关系实体和关系是双向的,并且 Role实体有一个名为 user 的属性。

现在在您的Role中实体,您将提供有关 JoinTable 的详细信息像这样:

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

属性名称userRole实体应与 mappedBy 匹配您在 User 中声明的属性@OneToMany 的实体注解。添加user字段至 Role实体使关系是双向的。

关于mysql - Hibernate和spring mvc中实体的双向映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26711686/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com