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

JPA多对多持久化

笪智志
2023-03-14
@Entity
@Table(name = "users")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Users.findAll", query = "SELECT u FROM Users u"),
@NamedQuery(name = "Users.findByUserId", query = "SELECT u FROM Users u WHERE u.userId = :userId"),
@NamedQuery(name = "Users.findByUsername", query = "SELECT u FROM Users u WHERE u.username = :username"),
@NamedQuery(name = "Users.findByPassword", query = "SELECT u FROM Users u WHERE u.password = :password")})
public class Users implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 60)
@Column(name = "user_id")
private String userId;
@Basic(optional = false)
@NotNull
@Pattern(regexp="[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?", message="Invalid email")
@Size(min = 1, max = 45)
@Column(name = "username")
private String username;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 120)
@Column(name = "password")
private String password;
@JoinTable(name = "users_has_roles", joinColumns = {
    @JoinColumn(name = "users_user_id", referencedColumnName = "user_id")}, inverseJoinColumns = {
    @JoinColumn(name = "roles_role_id", referencedColumnName = "role_id")})
@ManyToMany
private Collection<Roles> rolesCollection;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "usersUserId")
private Collection<UserAccount> userAccountCollection;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "usersUserId")
private Collection<UserDetails> userDetailsCollection;

...

All the getter and setter methods etc.
@Entity
@Table(name = "roles")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Roles.findAll", query = "SELECT r FROM Roles r"),
@NamedQuery(name = "Roles.findByRoleId", query = "SELECT r FROM Roles r WHERE r.roleId = :roleId"),
@NamedQuery(name = "Roles.findByRoleName", query = "SELECT r FROM Roles r WHERE r.roleName = :roleName"),
@NamedQuery(name = "Roles.findByRolePermission", query = "SELECT r FROM Roles r WHERE r.rolePermission = :rolePermission"),
@NamedQuery(name = "Roles.findByRoleDescription", query = "SELECT r FROM Roles r WHERE r.roleDescription = :roleDescription")})
public class Roles implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 60)
@Column(name = "role_id")
private String roleId;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 45)
@Column(name = "role_name")
private String roleName;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 45)
@Column(name = "role_permission")
private String rolePermission;
@Size(max = 45)
@Column(name = "role_description")
private String roleDescription;
@ManyToMany(mappedBy = "rolesCollection")
private Collection<Users> usersCollection;

...

All the getter and setter methods etc.

谢谢

----更新----

// New Users
Users currentUser = new Users();
currentUser.setUserId(userId);
currentUser.setUsername(email);
currentUser.setPassword(password);
getUsersFacade().create(currentUser);

共有1个答案

曹渝
2023-03-14

好的,首先感谢美子带领我找到答案。我只是想贴出一个答案,可能会直接帮助任何人可能在我的位置。此外,这是基于一个尤里卡时刻,所以它可能不是正确的技术,但这是我的看法。

我面临的一个大问题是,在MySQL中,我可以将桥接表视为一个单独的表!(很抱歉,我不能发布我的EER图的图像,但我现在似乎没有足够的特权)所以我假设Java也会将桥接表视为表!其实不是。在Java中,这个桥接表并不是作为常规表存在的,它实际上是由与之关联的相反的表集合类型表示的。

对我来说,最简单的方法就是完全忘记桥接表,而专注于两个“真实”表,并将这些表中的数据关联起来。下面的代码不是最佳实践,因为我只是设置了role_id,但它很好,只是为了表明我的观点。

List<Roles> userRoleList = new ArrayList<Roles>();

Users currentUser = new Users();
currentUser.setUserId(userId);
currentUser.setUsername(email);
currentUser.setPassword(password);

Roles userRole = new Roles();
userRole.setRoleId("2");

userRoleList.add(userRole);
currentUser.setRolesCollection(userRoleList);

getUsersFacade().create(currentUser);
 类似资料:
  • 但是,我有两个实体:角色和用户,它们具有多对多的关系,这由rolesusers表表示。在我的应用程序中,我使用的是JSF2.0,我有一个表单来操作用户数据,还有一个表单,它包含所有角色名称的列表和一个selectBooleanCheckbox来查看用户的角色(如果是,则选中)。此外,它必须有添加或删除rol的可能性(选中或取消选中selectBooleanCheckbox),但当我这样做时,我有两

  • persistenceException:DB2 SQL错误:sqlcode=-206,sqlstate=42703,sqlerrmc=t0.id,driver=3.52.95{prepstmnt 1029586270

  • 我试图持久化一个非常简单的单向一对多关系,但EclipseLink(2.3.1)失败了。 服务类(父级):

  • 问题内容: 我在很大程度上依赖localStorage来编写插件。所有用户设置都存储在其中。有些设置要求用户写正则表达式,如果他们的正则表达式规则在某个时候消失了,他们会感到很遗憾。所以现在我想知道localStorage的持久性如何。 从规格: 用户代理应仅出于安全原因或在用户要求时才使本地存储区中的数据过期。 上面看起来像在客户端上的cookie一样工作。即,当用户清除所有浏览器数据(历史记录

  • 问题内容: 我尝试使用 多个线程 持久化对象时遇到问题。 细节 : 假设我有一个对象,该对象具有(一对多关系)列表,并且又包含(一对多关系)列表。 由于数量庞大(以十万计),我基于(基于某些业务逻辑)将其分组,并创建了 WORKER 线程(每个PaymentGroup一个线程)以形成对象并提交到数据库中。 问题是,每个工作线程都创建一个(包含唯一的一组)。 所有实体的主键都是自动生成的。 因此,存

  • 问题内容: 也许这是一个愚蠢的问题,但这困扰了我。 我有一个从员工到车辆的双向一对多关系。当我第一次将Employee保留在数据库中时(即它没有分配的ID),我也希望保留其关联的Vehicles。 目前,这对我来说很好,除了我保存的Vehicle实体没有自动映射关联的Employee,并且在数据库中Vehicle表中的employee_id外键列为空。 我的问题是,是否可以在雇员本身被保留的同时保