gpt4 book ai didi

java - 如何制作复合主键(java持久化注解)

转载 作者:太空狗 更新时间:2023-10-29 22:32:11 24 4
gpt4 key购买 nike

如何使表user_roles将两列(userID,roleID)定义为复合主键。应该很容易,只是不记得/找不到。

user实体:

@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "user_roles")
public List<RoleDAO> getRoles() {
return roles;
}

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Integer getUserID() {
return userID;
}

roles实体:

@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "user_roles")
public List<UserDAO> getUsers() {
return users;
}

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Integer getRoleID() {
return roleID;
}

谢谢。

** 更多信息

于是就有了第三张表user_roles (上面自动生成的)需要 userID来自 user实体和roleID来自 roles实体。现在我需要将生成的表 ( user_roles ) 中的这两列作为复合主键。

最佳答案

你已经在这里得到了一些关于如何完全按照你的要求去做的很好的答案..

作为引用,我只提一下在 Hibernate 中执行此操作的推荐方法,即使用代理键作为主键,并将业务键标记为 NaturalId:

Although we recommend the use of surrogate keys as primary keys, you should try to identify natural keys for all entities. A natural key is a property or combination of properties that is unique and non-null. It is also immutable. Map the properties of the natural key inside the element. Hibernate will generate the necessary unique key and nullability constraints and, as a result, your mapping will be more self-documenting.

It is recommended that you implement equals() and hashCode() to compare the natural key properties of the entity.

在代码中,使用注释,这看起来像这样:

@Entity
public class UserRole {
@Id
@GeneratedValue
private long id;

@NaturalId
private User user;
@NaturalId
private Role role;
}

使用它会为您省去很多麻烦,因为当您经常需要引用/映射组合主键时您会发现。

我通过艰难的方式发现了这一点,最后放弃了与 Hibernate 的斗争,而是决定顺其自然。我完全理解这在您的情况下可能是不可能的,因为您可能正在处理遗留软件或依赖项,但我只是想提一下以供将来引用。 (如果您不能使用它也许其他人可以!)

关于java - 如何制作复合主键(java持久化注解),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1212058/

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