2017-02-09 3 views
0

У меня есть некоторые поля, которые нужно обновить в hashmap, и я пытаюсь поместить его в session.update (объект объекта). Но Im получает ошибку исключения как Неизвестный объект: java.util.HashMap. Вот мой код.можно обновить конкретное поле hibernate

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 

User.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(); 
     } 
    } 

И я не могу запишите строковый запрос либо потому что у меня есть несколько таблиц и разные значения. И я даже получаю имена классов динамически. Поэтому я не могу использовать строковый запрос для общего. Итак, если я могу, пожалуйста, скажите мне.

Теперь, как я могу обновить эти два значения в базе данных. Пожалуйста, помогите

+0

Вы пытаетесь сохранить java.util.HashMap прямо в своей базе данных !? Вы уверены, что хотите это сделать? – mwe

+0

вы не можете передать hashmap методу update() .... вы должны передать объект, аннотированный аннотацией @Entity. Извлеките значение из карты и поместите в класс сущности, а затем просто обновите –

+0

Вы уже использовали Hibernate? Знаете ли вы, что Hibernate предназначен для сохранения целых объектов (со спецификацией, атрибут которых сопоставляется с каким полем), а не для поиска имени табуляции, а затем глупо создавать sql-update-statements? –

ответ

0

Я сделал это с помощью java.lang.reflect.Field. Поэтому я получил конкретный объект из базы данных, и я получу ключ и значения, отделенные от Карты, и свяжусь с полем, сделав ссылку на класс, который мне нужен. Теперь это работает отлично. Даже если я получу лучшие ответы, чем мои, это нормально.

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(); 
     } 
    } 

Спасибо всем, кто поддержал.

Смежные вопросы