在 Hibernate JPA 中未触发更新级联
ON UPDATE CASCADE not triggered in Hibernate JPA
见以下关系:
Table RECIPE_USERCATEGORY_REL
有一个 ON UPDATE CASCADE
触发器,所以如果我在 psql 控制台中执行以下命令, ruc_ucat_category
的值也会自动更新.
update usercategory set ucat_category = 'OldCategory' where ucat_category = 'NewCategory';
这行得通。
现在的问题是休眠。我的服务中有这个方法 class:
public void renameCategory(String userId, String fromCategory, String toCategory)
{
TypedQuery<UserCategory> query = entityManager.createNamedQuery("UserCategory.findAllCaseSensitiveByUserIdAndPrefix", UserCategory.class);
query.setParameter(ApplicationConstants.PARAM_USER_ID, userId);
query.setParameter("category", fromCategory);
List<UserCategory> resultList = query.getResultList();
if (resultList == null || resultList.isEmpty())
{
return;
}
UserCategory userCategory = resultList.get(0);
userCategory.setCategory(toCategory);
}
我可以保证 userCategory 的值为 'OldCategory'。在我看来,更新应该有效,因为数据库的触发器应该更新关系 table 的值,但没有任何反应。为什么会这样?
附加信息:在我的实体中,USERCATEGORY
<-> RECIPE_USERCATEGORY_REL
关系上没有 @OneToMany
和 @ManyToOne
声明(仅在 RECIPE
<-> RECIPE_USERCATEGORY_REL
关系就是)。这是因为 RECIPE_USERCATEGORY_REL
不是真正的联接 table。 USERCATEGORY
类似于增长查找 table,因此 Hibernate 不得 干扰此处的工作流程。 USERCATEGORY
<-> RECIPE_USERCATEGORY_REL
的唯一关系是数据库中的引用完整性。
这就是实体的样子,但正如我所说,与类别 table 没有休眠关系,因为 Hibernate 不应该关心这种关系:
@Table(name = "RECIPE_USERCATEGORY_REL")
public class RecipeUserCategoryRel implements Serializable
{
private static final long serialVersionUID = 1L;
@EmbeddedId
private RecipeUserCategoryRelPk recipeUserCategoryRelPk = new RecipeUserCategoryRelPk();
@MapsId("rcpId")
@ManyToOne
@JoinColumn(name = "ruc_rcp_id", referencedColumnName = "rcp_id", insertable = false, updatable = false)
private Recipe recipe;
...
}
和...
@Embeddable
public class RecipeUserCategoryRelPk implements Serializable
{
private static final long serialVersionUID = 1L;
@Column(name = "ruc_rcp_id")
private Long rcpId;
@Column(name = "ruc_ucat_category")
private String category;
@Column(name = "ruc_ucat_acc_identifier")
private Long identifier;
public RecipeUserCategoryRelPk()
{
}
...
//getters, setters, hashcode, equals
}
我在其他一些帖子中看到,在 JPA 中不允许更改主键。但是,我的用例肯定是更改主键,但在我的例子中,这不是一个常见的用例,也不是应用程序的 'real' 部分,但有些情况下用户需要修改旧数据,所以我需要提供此功能。
(作为解决方法,我进行了本机更新查询)
见以下关系:
Table RECIPE_USERCATEGORY_REL
有一个 ON UPDATE CASCADE
触发器,所以如果我在 psql 控制台中执行以下命令, ruc_ucat_category
的值也会自动更新.
update usercategory set ucat_category = 'OldCategory' where ucat_category = 'NewCategory';
这行得通。 现在的问题是休眠。我的服务中有这个方法 class:
public void renameCategory(String userId, String fromCategory, String toCategory)
{
TypedQuery<UserCategory> query = entityManager.createNamedQuery("UserCategory.findAllCaseSensitiveByUserIdAndPrefix", UserCategory.class);
query.setParameter(ApplicationConstants.PARAM_USER_ID, userId);
query.setParameter("category", fromCategory);
List<UserCategory> resultList = query.getResultList();
if (resultList == null || resultList.isEmpty())
{
return;
}
UserCategory userCategory = resultList.get(0);
userCategory.setCategory(toCategory);
}
我可以保证 userCategory 的值为 'OldCategory'。在我看来,更新应该有效,因为数据库的触发器应该更新关系 table 的值,但没有任何反应。为什么会这样?
附加信息:在我的实体中,USERCATEGORY
<-> RECIPE_USERCATEGORY_REL
关系上没有 @OneToMany
和 @ManyToOne
声明(仅在 RECIPE
<-> RECIPE_USERCATEGORY_REL
关系就是)。这是因为 RECIPE_USERCATEGORY_REL
不是真正的联接 table。 USERCATEGORY
类似于增长查找 table,因此 Hibernate 不得 干扰此处的工作流程。 USERCATEGORY
<-> RECIPE_USERCATEGORY_REL
的唯一关系是数据库中的引用完整性。
这就是实体的样子,但正如我所说,与类别 table 没有休眠关系,因为 Hibernate 不应该关心这种关系:
@Table(name = "RECIPE_USERCATEGORY_REL")
public class RecipeUserCategoryRel implements Serializable
{
private static final long serialVersionUID = 1L;
@EmbeddedId
private RecipeUserCategoryRelPk recipeUserCategoryRelPk = new RecipeUserCategoryRelPk();
@MapsId("rcpId")
@ManyToOne
@JoinColumn(name = "ruc_rcp_id", referencedColumnName = "rcp_id", insertable = false, updatable = false)
private Recipe recipe;
...
}
和...
@Embeddable
public class RecipeUserCategoryRelPk implements Serializable
{
private static final long serialVersionUID = 1L;
@Column(name = "ruc_rcp_id")
private Long rcpId;
@Column(name = "ruc_ucat_category")
private String category;
@Column(name = "ruc_ucat_acc_identifier")
private Long identifier;
public RecipeUserCategoryRelPk()
{
}
...
//getters, setters, hashcode, equals
}
我在其他一些帖子中看到,在 JPA 中不允许更改主键。但是,我的用例肯定是更改主键,但在我的例子中,这不是一个常见的用例,也不是应用程序的 'real' 部分,但有些情况下用户需要修改旧数据,所以我需要提供此功能。 (作为解决方法,我进行了本机更新查询)