0

我有一个 Spring/JPA(Hibernate 作为 JPA 提供者), MySQL 作为数据库提供者。即使我可以从数据库中读取数据,我似乎也无法成功保存数据。

我已经搜索了stackoverflow,并且大多数解决方案都涉及使用@Transactional(也是类)装饰保存方法。我验证了整体配置,但我似乎无法找出我哪里出错了。

这是我的配置

持久性.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)确实显示事务正在回滚。但是休眠日志是我遇到过的最糟糕的日志之一(或者我可能会失明)。它们非常冗长,很难找到错误。但是,我确实接受我不是 Hibernate 的老手。

我面临的另一个挑战是我分别设计了数据库和对象并尝试使用表验证对象(其他方法是让 Hibernate 生成表或让它从表中生成实体)。尽管这无论如何都不是一个坏习惯,但重要的是要确保数据库和实体的设计是正确和合法的,这样一切才能正常工作。应用程序可能构建得很好,JPA 可能会验证表,但这并不一定意味着您的数据模型清晰易读。我在 JPA 的最初冒险中学到了一些艰难的经历,但我感谢 Stackoverflow 的开发人员在这个过程中的智慧。

于 2013-10-30T16:21:54.193 回答