休眠 - 通过NaturalID删除

时间:2015-01-30 14:22:42

标签: hibernate

我想知道,有没有办法通过Hibernate使用删除实体 它的naturalID - 带注释的字段。

我知道有一种方法可以加载它们(通过Session.getByNaturalID / Session.getBySimpleNaturalID方法)

我的观点是删除一个实体,因为我不知道它的ID。 我不想只为ID查询数据库,也不想写 删除HQL,这对于更改而言并不灵活(删除fieds等)

那么,有这样的方式吗? 这样做是否合理? 谢谢!

1 个答案:

答案 0 :(得分:0)

您可以尝试使用以下Criteria API代码,其中natural-id可以作为限制提供。 CriteriaDelete可用于删除实体。

CriteriaBuilder cb = entityManager.getCriteriaBuilder();  
CriteriaDelete<XEntity> deleteXEntity = cb.createCriteriaDelete(XEntity.class);
deleteXEntity.where(Restrictions.naturalId().set("fieldName", "xyz"));
entityManager.createQuery(deleteXEntity).executeUpdate();

修改:

添加了代码以添加对可用自然ID的限制;没有明确地设置它们。

    CLassMetaData entityMetaData = session.getSessionFactory().getClassMetadata(XEntity.class);

    int[] naturalIds = entityMetaData.getNaturalIdentifierProperties();
    String[] propertyNames = entityMetaData.getPropertyNames();

    for(Object o : deleteObjects){

       for(int i=0; i<naturalIds.length ; i++){

          Object xPropertyValue = getPropertyValue(o, propertyNames[i], EntityMode.POJO);

          if(xPropertyValue != null)
           Restrictions.naturalId().set(propertyNames[i], xPropertyValue);

           //-- Add restrictions
       }
    //-- Delete object with all restrictions
   }

[这是伪代码,可以相应地进行更改;我还没试过。]