我想知道,有没有办法通过Hibernate使用删除实体 它的naturalID - 带注释的字段。
我知道有一种方法可以加载它们(通过Session.getByNaturalID / Session.getBySimpleNaturalID方法)
我的观点是删除一个实体,因为我不知道它的ID。 我不想只为ID查询数据库,也不想写 删除HQL,这对于更改而言并不灵活(删除fieds等)
那么,有这样的方式吗? 这样做是否合理? 谢谢!
答案 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
}
[这是伪代码,可以相应地进行更改;我还没试过。]