在Hibernate JPA中未触发ON UPDATE CASCADE

时间:2017-02-26 10:49:28

标签: postgresql hibernate jpa cascade

请参阅以下关系:

relations

RECIPE_USERCATEGORY_REL有一个ON UPDATE CASCADE触发器,所以如果我在psql控制台中执行以下命令,ruc_ucat_category的值也会自动更新。

 update usercategory set ucat_category = 'OldCategory' where ucat_category = 'NewCategory';

这很有效。 现在的问题是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具有值&#39; OldCategory&#39;。在我看来,更新应该有效,因为数据库的触发器应该更新关系表的值,但没有任何反应。为什么会这样呢? 其他信息:在我的实体中,@OneToMany&lt; - &gt;上没有@ManyToOneUSERCATEGORY声明。 RECIPE_USERCATEGORY_REL关系(仅限RECIPE&lt; - &gt; RECIPE_USERCATEGORY_REL关系)。这是因为RECIPE_USERCATEGORY_REL不是真正的连接表。 USERCATEGORY类似于不断增长的查找表,因此Hibernate 不得干扰此处的工作流程。 USERCATEGORY&lt; - &gt;的唯一关系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
}

1 个答案:

答案 0 :(得分:0)

我在其他一些帖子中读到,JPA中不允许更改主键。但是,我的用例肯定是在更改主键,但在我的情况下,它不是常见的用例,也不是应用程序的“真实”部分,但有些情况下用户需要修改旧数据,所以我需要提供这个功能。 (作为解决方法,我进行了本机更新查询)