【问题标题】:Spring Roo and Hibernate: how to prevent deletionSpring Roo 和 Hibernate:如何防止删除
【发布时间】:2014-05-23 12:48:51
【问题描述】:

我使用 Spring Roo 作为框架,使用 Hibernate 作为持久性。

在我的应用程序中,用户和角色具有多对多关系。这就是User 模型的定义方式:

公共类用户{

/**
 */
@ManyToMany(cascade = CascadeType.ALL)
private Set<Rol> roles = new HashSet<Rol>();

};

没有从RoleUser 的导航。

当用户被删除时,下面是生成的休眠查询:

Hibernate: select user0_.id as id1_5_0_, user0_.password as password2_5_0_, user0_.email as email3_5_0_, user0_.enabled as enabled4_5_0_, user0_.login as login5_5_0_, user0_.name as name6_5_0_, user0_.first_last_name as first7_5_0_, user0_.segundo_last_name as segundo8_5_0_, user0_.version as version9_5_0_ from user user0_ where user0_.id=?
Hibernate: select roles0_.user as user1_5_1_, roles0_.roles as roles2_6_1_, rol1_.id as id1_4_0_, rol1_.name as name2_4_0_, rol1_.version as version3_4_0_ from user_roles roles0_ inner join role rol1_ on roles0_.roles=rol1_.id where roles0_.user=?
Hibernate: delete from user_roles where user=?
Hibernate: delete from role where id=? and version=?

我遇到了一个异常,我相信原因是最后一行。为什么要删除角色?我怎样才能防止这种情况发生?

【问题讨论】:

  • Cascadetype 全部负责
  • 那我应该如何设置它的值呢?
  • 多对多记录即使没有cascase也会被删除,没关系

标签: java spring hibernate spring-mvc spring-roo


【解决方案1】:

只需丢掉(cascade = CascadeType.ALL)

通过在roles 关系上指定cascade = CascadeType.ALL(根据定义包括CascadeType.REMOVE),您基本上告诉休眠您希望在删除user 时删除roles,这是不必要的。

你想要的只是user_roles中的行(关系行)将在删除用户时被删除,这是由休眠自动完成的,无需指定“CascadeType.REMOVE / ALL”

【讨论】:

  • 太棒了,这很有用。现在我明白cascade 的用途了。我也有一些实体在删除时我还想删除其他相关实体。即我的实体Person 具有多对一Jobs,但没有从工作到人的导航能力。有什么办法可以使用级联,所以当Job 被删除时,该工作的所有人员条目也将被删除?或者唯一的方法是手动?
  • 这个问题有不止一个可能的答案,所以我建议你搜索/发布它
猜你喜欢
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-07
  • 1970-01-01
  • 2011-03-14
  • 1970-01-01
相关资源
最近更新 更多