0

データベースプロバイダーとしてMySQLを使用したSpring/JPA(JPAプロバイダーとしてHibernateを使用)があります。データベースからデータを読み取ることはできますが、データを正常に永続化できないようです。

私はstackoverflowを検索しましたが、ほとんどのソリューションは、saveメソッドを@Transactional(クラスも)で装飾することを扱っていました。全体的な構成を確認しましたが、どこが間違っているのかわかりません。

これが私の構成です

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/ p   ersistence/persistence_2_0.xsd"
             version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
    <persistence-unit name="brPersistenceUnit" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>java:comp/env/jdbc/brDS</jta-data-source>
        <class>com.uhsarp.br.domain.Bill</class>
        <properties>
            <property name="hibernate.hbm2ddl.auto" value="validate"/>
              <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" /> 
        </properties>
    </persistence-unit>
</persistence>

春のアプリケーションコンテキスト

   <?xml version="1.0" encoding="UTF-8" standalone="no"?>
   <beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:p="http://www.springframework.org/schema/p"
      xmlns:tx="http://www.springframework.org/schema/tx"
      xmlns:aop="http://www.springframework.org/schema/aop"
      xmlns:context="http://www.springframework.org/schema/context"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
                          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                          http://www.springframework.org/schema/context
                          http://www.springframework.org/schema/context/spring-context-3.0.xsd
                          http://www.springframework.org/schema/tx
                          http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

   <!-- JPA Entity Manager Factory -->
 <!--    <bean id="entityManagerFactory" 
         class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
         p:dataSource-ref="brDS"/>-->

         <bean id="entityManagerFactory" 
 class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"> 
     <property name="persistenceUnitName" value="brPersistenceUnit"/> 
  </bean> 
   <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

   <!-- Database LOB Handling -->
   <bean id="defaultLobHandler" class="org.springframework.jdbc.support.lob.DefaultLobHandler" />

   <!-- Read in DAOs from the JPA package -->
   <context:component-scan base-package="com.uhsarp.br.dao.framework.impl" />

   <!-- Transaction Config -->
   <bean id="transactionManager"
         class="org.springframework.orm.jpa.JpaTransactionManager"
         p:entityManagerFactory-ref="entityManagerFactory"/>
 <tx:annotation-driven/>
</beans>

DAO クラスのスニペット

 @Repository("billDAO")
 @Transactional
 public class BillDAOImpl  implements BillDAO{
  @PersistenceContext
  private EntityManager em;

    @Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)
 public Bill save(Bill bill) {
     if (bill.getId() == null) {
                     em.persist(bill);

        return bill;
    } else {
        return em.merge(bill);
    }
 }
  }
4

1 に答える 1

0

問題はJPAにはありませんでした。

フロントエンドから (JSON として) データを受信しました。Spring MVC がデータ バインディングを行い、'Bill' オブジェクトを作成しました。オブジェクト構造はエラーを表示せずに形成されましたが、ID が適切に設定されていなかったため、JPA は .persist クエリに失敗しました。

休止状態のログ (persistence.sql の show_sql) は、トランザクションがロールバックされていることを示していました。しかし、休止状態のログは、私がこれまでに遭遇した中で最悪のログの 1 つです (または、盲目になる可能性があります)。それらは非常に冗長で、エラーを見つけるのが困難です。ただし、私は Hibernate のベテランではないことを認めます。

また、私が直面した別の課題は、データベースとオブジェクトを別々に設計し、テーブルでオブジェクトを検証しようとしたことです (他の方法は、Hibernate にテーブルを生成させるか、テーブルからエンティティを生成させることです)。これは決して悪い習慣ではありませんが、データベースとエンティティの設計が適切であり、すべてが適切に機能するために正当であることを確認することが重要です。アプリケーションは正常にビルドされ、JPA はテーブルを検証するかもしれませんが、それは必ずしもデータモデルが判読可能であることを意味しません。JPA での最初の冒険を通じて学んだいくつかの困難な経験がありますが、このプロセスにおける知恵について Stackoverflow の仲間の開発者に感謝します。

于 2013-10-30T16:21:54.193 に答える