当前位置: 首页 > 面试题库 >

如何保持@ManyToMany关系-重复条目或独立实体

仲孙诚
2023-03-14
问题内容

我想保持与ManyToMany关系的实体。但是我在坚持过程中遇到了一些问题。

我的实体:

@Entity
@Table(name = "USER")
public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    Long userId;

    @Column(name = "NAME", unique = true, nullable = false)
    String userName;

    @Column(name = "FORNAME")
    String userForname;

    @Column(name = "EMAIL")
    String userEmail;

    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinTable(name = "USER_USER_ROLES", joinColumns = @JoinColumn(name = "ID_USER"), inverseJoinColumns = @JoinColumn(name = "ID_ROLE"))
    List<UserRoles> userRoles = new ArrayList<UserRoles>();

    // getter et setter
}

@Entity
@Table(name = "USER_ROLES")
public class UserRoles implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    Long userRolesId;

    @Column(unique = true, nullable = false, name = "ROLE_NAME")
    String roleName;

    // getter et setter
}

服务代码:

User user = new User();
UserRoles role;
try {
    role = userRolesServices.getUserRoleByName("ROLE_USER"); // find jpql - transaction
} catch (RuntimeException e) {
    LOGGER.debug("No Roles found");
    role = new UserRoles("ROLE_USER"); // create new
}
user.addUserRole(role);
user.setUserName(urlId);
user.setUserForname(fullName);
user.setUserEmail(email);
userServices.createUser(user); // em.persist(user) - transaction

第一次,当我尝试使用UserRoles“ ROLE_USER”保留用户时,没有问题。插入User和UserRoles以及联接表。

我的问题是当我尝试使用相同的UserRoles保留第二个User时。我通过找到它来检查UserRoles是否存在(
userRolesServices.getUserRoleByName(…) )。如果存在->将此UserRoles添加到用户列表(ID
+角色名称),否则我创建一个新角色(仅角色名称)。

当我尝试保留第二个User时,我得到以下异常: “要保留的分离实体:..... UserRoles”
(也许是因为在另一笔交易中执行了getUserRoleByName)

如果我不使用 getUserRoleByName (仅 new UserRoles(“ ROLE_USER”); ),则会获得以下异常:
… ConstraintViolation:“ ROLE_NAME”的重复条目…”

那么,如何正确保留具有 @ManyToMany 关系的实体?


问题答案:

对于上述问题,我会说您的实体关系级联是错误的。请考虑以下因素:用户可以具有多个角色,但是系统中可以存在固定数量的角色。因此,来自User实体的CASCADE
ALL
没有任何意义,因为的生命周期不UserRoles应该取决于User实体的生命周期。例如,当我们删除时UserUserRoles不应将其删除。

*仅当您传递已将主键设置为持久性的html" target="_blank">对象时,才会发生 *分离实体持久性 异常。

删除级联,您的问题将立即得到解决,您只需决定如何插入用户角色即可。据我说,应该有单独的功能。

也不要使用ArrayList,使用HashSetArrayList允许重复。



 类似资料:
  • 问题内容: 我试图保留与已经保留的其他对象具有多对多关系的对象。 这是我的持久化对象(它们已经持久化在数据库中,这是一个MySql): Product 这是我尝试创建的没有持久性的对象 这是我的class,它接收产品名称数组,使用名称查找产品并将其放入保留对象。 这是我的ProductDAO界面: 这是我的spring配置文件: 这是完整的堆栈跟踪: 问题答案: 我有同样的问题,并通过删除来解决。

  • 我想在(您可以将其视为Student)实体和实体之间实现一个@ManyTomany单向的。很简单,一个教室可以有很多学生,而学生可以有很多教室。我希望它是单向的,因为我希望班级只知道它包含什么学生,学生不必知道他们有什么班级。这就是我目前所拥有的: ClassRoom.java Account.java 我通过以下代码保存它(使用Spring JPA): 但我得到了以下错误: 下面是StackTr

  • 我正在尝试链接mysql表(role、user、user_role)。 UserModel实体包含字段“roles”。 当我保存用户时,表'roles'中会自动创建新行。如何取消重复角色?

  • 问题内容: 我有一些与关系有关的实体: 和 使用某些模型执行保存模型时,一切正常。表存储这些实体的所有键。但是,使用驱动程序保存模型时,表不会更改。我认为映射存在问题。 问题答案: 那是预期的行为。在双向多对多关联中,一侧必须是反侧。在您的情况下,这是一面,因为它包含: 拥有关系的字段。除非关系是单向的,否则为必需。 这意味着是关联的所有者,并且Hibernate仅在维护关联时检查该侧。

  • 问题内容: 我正在尝试将具有不同任务和工作人员的多个芹菜队列保留在同一Redis数据库中。实际上,只是在我的机器上只需要一台Redis服务器而不是两台Redis服务器的便利性问题。 我逐字阅读了celery教程文档,因为它是让它对我有用的唯一方法。现在,当我尝试使用稍作调整的名称/队列来复制所有内容时,它总是会出错。 注意-我是Python和Celery的新手,这显然是问题的一部分。我不确定哪个部

  • 问题内容: 我遇到了很多对多关系的问题,当我保存模型时(通过管理员),并没有在模型中更新它们,并尝试在附加到信号的函数中或关联的的函数中使用新值。我试图通过使用带有id的get函数在这些函数中重新加载对象,但是它仍然具有旧值。 这是交易问题吗?交易结束时会发出信号吗? 问题答案: 通过管理表单保存模型时,这不是原子交易。首先保存主对象(以确保它具有PK),然后清除 M2M ,并将新值设置为表单中出