Hibernate saveOrUpdate Не работает с сопоставлением Dynami c - PullRequest
1 голос
/ 08 июля 2020

Я использую Hibernate Dynami c моделирование для сохранения моих объектов. Проблема, с которой я столкнулся прямо сейчас, - это исключение, когда я вызываю функцию saveOrUpdate. Исключение составляет

2020-07-08 23:14:06 WARN  SqlExceptionHelper:137 - SQL Error: 1062, SQLState: 23000
2020-07-08 23:14:06 ERROR SqlExceptionHelper:142 - Duplicate entry 'TYUTQ-2020-07-08 20:19:53' for key 'PRIMARY'
2020-07-08 23:14:06 ERROR ExceptionMapperStandardImpl:39 - HHH000346: Error during managed flush [org.hibernate.exception.ConstraintViolationException: could not execute statement]

Когда объект будет вставлен в первый раз, он будет успешно вставлен, но когда объект уже присутствует в базе данных, метод saveOrUpdate снова вызовет метод insert . Я проверил, используя свойство SHOW_ SQL = "true".

Вопрос в том, почему он не вызывает метод update ?

Файл сопоставления гибернации:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
   <class entity-name="myTable">
      <composite-id>
         <key-property name="code" column="code" type="java.lang.String" />
         <key-property name="datetime" column="datetime" type="java.sql.Timestamp" />
      </composite-id>
      <property name="A" column="A_colummn" type="java.math.BigDecimal" />
      <property name="B" column="B_column" type="java.math.BigDecimal" />
      <property name="C" column="C_column" type="java.math.BigDecimal" />
      <property name="D" column="D_column" type="java.math.BigDecimal" />
      <property name="E" column="E_column" type="java.math.BigDecimal" />
      <property name="F" column="F_column" type="int" />
      <property name="G" column="G_column" type="java.sql.Timestamp" />
   </class>
</hibernate-mapping>

И мой код

List<Map<String, Object>> toBeSaved = getTransformedObjects();// all objects belong to same table
 Transaction tx = null;
 try (SessionFactory factory = HibernateUtils.getSessionFactoryFromXml(profile, job.getXmlMapping());// Creating Session from XML in my utils class
      Session session = factory.openSession()) {
         tx = session.beginTransaction();
         toBeSaved.forEach(map -> {
            session.saveOrUpdate(job.getTableName(), map);
         });
         tx.commit();// Here exception occurs
       } catch (HibernateException e) {
         rollbackTransactionAndPrintException(e, destTx);
       }

В настоящее время на карте есть только одна запись, а содержимое карты:

{
   datetime=2020-07-08 20:19:53.21, 
   F_column=1, 
   A_colummn=0.421, 
   G_column=2020-06-16 17:21:05.0, 
   code=TYUTQ, 
   B_column=0.000, 
   C_column=0.000, 
   D_column=50.540
}

Я использую версию гибернации 5.3.5.Final и я сильно в нем застрял. Может ли кто-нибудь сказать мне, как это решить? Заранее спасибо.

...