【问题标题】:is it possible to update particular field hibernate是否可以更新特定字段休眠
【发布时间】:2017-06-27 08:10:31
【问题描述】:

我有一些字段要在 hashmap 中更新,我正试图将它放在 session.update(Object object) 中。但我收到异常错误为 Unknown entity: java.util.HashMap。这是我的代码。

 private Map <String, Object> conditions=new HashMap <String, Object>();
    public void addCondition(String field, Object condition){
            conditions.put(field, condition);
        }
    public Object getFilter(String field){
            return conditions.get(field);
        }
    public Map<String,Object>getFilterMap(){        
            return conditions;
        }

要更新这些字段:

 class_name.addCondition("loginName", "dadan_evil"); 
    class_name.addCondition("lastName", "Pirate");
    session.update(filter.getFilterMap());//I tried this, but not working

用户.hbm.xml:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
 "-//Hibernate/Hibernate Mapping DTD//EN"
 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 

<hibernate-mapping>
   <class name="in.co.User" table="user">
      <meta attribute="class-description">
         This class contains the user detail. 
      </meta>
      <id name = "loginName" type="string" column="loginName">

      </id>
      <property name="passCode" column="passCode" type="string"/>
      <property name="firstName" column="firstName" type="string"/>
      <property name="lastName" column="lastName" type="string"/>
      <property name="alternateEMail" column="alternateEMail" type="string"/>
      <property name="mobile" column="mobile" type="string"/>
      <property name="sysAdmin" column="sysAdmin" type="boolean"/>
      <property name="deleted" column="deleted" type="boolean"/>
      <property name="authenticationCode" column="authenticationCode" type="string"/>
      <property name="authenticated" column="authenticated" type="boolean"/>

   </class>
</hibernate-mapping>

还有我的更新方法:

private static void updateFromQuery(DBFilter filter) throws Exception {
        Session session = factory.openSession();

        try{
            Class<?> className = filter.getCollectionClass();
            Criteria criteria = session.createCriteria(className);
            criteria.add(Restrictions.allEq(filter.getFilterMap()));
            //I dont know how to update this, just an imaginary parameter
            session.update(filter.getFilterMap());

        }catch(HibernateException e){
            e.printStackTrace();
        }finally{
            session.close();
        }
    }

我也无法写下字符串查询,因为我有多个表和不同的值。而且我什至动态地获取类名称。所以我不能使用对所有人通用的字符串查询。所以,如果可以的话,请告诉我。

现在,如何将这两个值更新到数据库中。请帮忙

【问题讨论】:

  • 您正在尝试将 java.util.HashMap 直接存储在您的数据库中!?你确定要这样做吗?
  • 你不能将 hashmap 传递给 update() 方法......你应该传递由 @Entity 注释注释的实体。从地图中提取值并将它们放入实体类中,然后简单地更新
  • 你已经用过Hibernate了吗?你知道 Hibernate 是用于持久化整个对象(指定哪个属性映射到哪个字段)而不是用于搜索表名然后愚蠢地创建 sql-update-statements 吗?
  • 有没有办法更新单个字段。如果有,请举个例子,因为这是我现在唯一的意图。
  • 首先:未知实体:java.util.HashMap 被抛出,因为您试图将 hashmap 传递给 update 方法,然后该方法检查该实体映射到的数据库表....显然它不会找到任何东西,因为它是一个哈希图。为了让您的问题更清楚,可以添加您想要更新的数据库结构,我们也许可以提出一些建议

标签: java hibernate


【解决方案1】:

我已经使用 java.lang.reflect.Field 完成了。所以我已经从数据库中检索了特定的对象,我将通过引用我需要的类来获取从 Map 中分离出来的键和值并与字段绑定。现在这工作正常。即使我得到比我更好的答案,也没关系。

private static void setField(Class<?> class_name,Object object, String fieldName, Object value) throws Exception {
        Field field = class_name.getDeclaredField(fieldName);       
        field.setAccessible(true);
        field.set(object, value);       
    }

    private static void updateFromQuery(DBFilter filter) throws Exception {
        Session session = factory.openSession();

        try {
            Class<?> className = filter.getCollectionClass();
            Criteria criteria = session.createCriteria(className);
            criteria.add(Restrictions.allEq(filter.getFilterMap()));
            List objectList = criteria.list();
            Transaction tx;
            tx = session.beginTransaction();
            for (Object object : objectList) {
                for (Map.Entry<String, Object> entry : filter.getValueMap().entrySet()) {
                    setField(className,object, entry.getKey(), entry.getValue());
                }
                session.update(object);
            }
            tx.commit();
        } catch (HibernateException e) {
            e.printStackTrace();
        } finally {
            session.close();
        }
    }

感谢所有支持的人。

【讨论】:

    猜你喜欢
    • 2016-03-02
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 2011-10-11
    相关资源
    最近更新 更多