请参阅以下关系:ON UPDATE CASCADE Hibernate的JPA不会触发
表RECIPE_USERCATEGORY_REL
有ON UPDATE CASCADE
触发,所以如果我想在PSQL控制台执行以下命令,的ruc_ucat_category
值将也会自动更新。
update usercategory set ucat_category = 'OldCategory' where ucat_category = 'NewCategory';
This works。 现在的问题是Hibernate。我在我的服务类中有这种方法:
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'。在我看来,更新应该是可行的,因为数据库的触发器应该更新关系表的值,但没有任何反应。这是为什么?
附加信息:在我的实体,没有对USERCATEGORY
<没有@OneToMany
和@ManyToOne
声明 - >RECIPE_USERCATEGORY_REL
关系(仅适用于RECIPE
< - >RECIPE_USERCATEGORY_REL
关系是)。这是因为RECIPE_USERCATEGORY_REL
不是真正的连接表。 USERCATEGORY
类似于不断增长的查找表,因此Hibernate 肯定不会干扰此处的工作流程。唯一的关系是USERCATEGORY
< - >RECIPE_USERCATEGORY_REL
是数据库中的参照完整性。
这是实体是什么样子,但正如我所说,没有休眠关系的类别表因为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
}