无法使用 JPA 2.0、Spring 2.5.6、Hibernate 3.6.1 和 Maven 在 HSQLDB 中持久化

Posted

技术标签:

【中文标题】无法使用 JPA 2.0、Spring 2.5.6、Hibernate 3.6.1 和 Maven 在 HSQLDB 中持久化【英文标题】:Cannot persist in HSQLDB using JPA 2.0, Spring 2.5.6, Hibernate 3.6.1 and Maven 【发布时间】:2011-05-16 19:43:38 【问题描述】:

我正在尝试使用 Hibernate 和 JPA 设置 Spring,但是在尝试持久化对象时,似乎没有任何内容添加到数据库中。

我正在使用以下内容:

<bean class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" id="dataSource">
    <property name="driverClassName" value="$database.driverClassName"/>
    <property name="url" value="$database.url"/>
    <property name="username" value="$database.username"/>
    <property name="password" value="$database.password"/>
</bean>
<bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<tx:annotation-driven mode="proxy" transaction-manager="transactionManager"/>
<bean class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean" id="entityManagerFactory">
<!--         <property name="dataSource" ref="dataSource"/> -->
</bean> 

我的数据库属性:

database.password=
database.url=jdbc\:hsqldb\:file\:ClientHarness;shutdown\=true
database.username=sa
database.driverClassName=org.hsqldb.jdbcDriver

BroadcastMessageDao:

@Repository("broadcastMessageDao")
public class BroadcastMessageDaoImpl extends GenericDaoImpl<BroadcastMessage>
implements BroadcastMessageDao 

  public BroadcastMessageDaoImpl() 
    super(BroadcastMessage.class);
  

  @Transactional
  public void persist(Object object)
    entityManager.persist(object);
  

GenericDaoImpl:

public class GenericDaoImpl<T extends DomainObject>
implements GenericDao<T> 

  private Class<T> type;

  protected EntityManager entityManager = EMF.getInstance().createEntityManager();

  public GenericDaoImpl(Class<T> type) 
    super();
    this.type = type;
  

  public void save(T object) 
    EntityTransaction trx = entityManager.getTransaction();
    trx.begin();
    try 
      entityManager.persist(object);
      entityManager.getTransaction().commit();
      trx.commit();
     finally 
      if (trx.isActive())
        trx.rollback();
      
    
  

我正在运行ClientHarness.main()

public class ClientHarness

  public static void main(String[] args) 

    List<String> contexts = new ArrayList<String>();

    contexts.add("classpath:META-INF/spring/applicationContext.xml");

    ApplicationContext appContext  = new ClassPathXmlApplicationContext(
      contexts.toArray(new String[contexts.size()])
    );

    BroadcastMessageDao broadcastMessageDao = new BroadcastMessageDaoImpl();
    BroadcastMessage broadcastMessage = new BroadcastMessage();
    broadcastMessage.setId(1L);
    broadcastMessage.setMessage("***********************!!!");
    broadcastMessageDao.save(broadcastMessage);
    System.out.println("Id" + broadcastMessage.getId());
  

我正在使用的依赖项:

<!-- Hibernate Dependencies -->
<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-core</artifactId>
  <version>3.6.1.Final</version>
</dependency>
<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-ehcache</artifactId>
  <version>3.3.1.GA</version>
</dependency> 
<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-entitymanager</artifactId>
  <version>3.6.1.Final</version>
</dependency>

<!-- Spring dependencies -->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-core</artifactId>
  <version>$spring.version</version>
  <exclusions>
    <exclusion>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
    </exclusion>
  </exclusions>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-test</artifactId>
  <version>2.5.6</version>
  <scope>test</scope>
  <exclusions>
    <exclusion>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
    </exclusion>
  </exclusions>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>2.5.6</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-aop</artifactId>
  <version>2.5.6</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-aspects</artifactId>
  <version>2.5.6</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-tx</artifactId>
  <version>$spring.version</version>
</dependency>
<dependency>
  <groupId>org.hsqldb</groupId>
  <artifactId>hsqldb</artifactId>
  <version>1.8.0.10</version>
</dependency>
<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-core</artifactId>
  <version>3.6.1.Final</version>
</dependency>
<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-entitymanager</artifactId>
  <version>3.6.1.Final</version>
</dependency>
<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-validator</artifactId>
  <version>4.1.0.Final</version>
  <exclusions>
    <exclusion>
      <groupId>javax.xml.bind</groupId>
      <artifactId>jaxb-api</artifactId>
    </exclusion>
    <exclusion>
      <groupId>com.sun.xml.bind</groupId>
      <artifactId>jaxb-impl</artifactId>
    </exclusion>
  </exclusions>
</dependency>
<dependency>
  <groupId>javax.validation</groupId>
  <artifactId>validation-api</artifactId>
  <version>1.0.0.GA</version>
</dependency>
<dependency>
  <groupId>cglib</groupId>
  <artifactId>cglib-nodep</artifactId>
  <version>2.2</version>
</dependency>
<dependency>
  <groupId>javax.transaction</groupId>
  <artifactId>jta</artifactId>
  <version>1.1</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-jdbc</artifactId>
  <version>$spring.version</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-orm</artifactId>
  <version>$spring.version</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-jpa</artifactId>
  <version>2.0.8</version>
</dependency>
<dependency>
  <groupId>commons-pool</groupId>
  <artifactId>commons-pool</artifactId>
  <version>1.5.4</version>
  <exclusions>
    <exclusion>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
    </exclusion>
  </exclusions>
</dependency>
<dependency>
  <groupId>commons-dbcp</groupId>
  <artifactId>commons-dbcp</artifactId>
  <version>1.3</version>
  <exclusions>
    <exclusion>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
    </exclusion>
    <exclusion>
      <groupId>commons-pool</groupId>
      <artifactId>commons-pool</artifactId>
    </exclusion>
    <exclusion>
      <groupId>xerces</groupId>
      <artifactId>xerces</artifactId>
    </exclusion>
    <exclusion>
      <groupId>xerces</groupId>
      <artifactId>xercesImpl</artifactId>
    </exclusion>
    <exclusion>
      <groupId>xml-apis</groupId>
      <artifactId>xml-apis</artifactId>
    </exclusion>
  </exclusions>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-web</artifactId>
  <version>$spring.version</version>
  <exclusions>
    <exclusion>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
    </exclusion>
  </exclusions>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
  <version>$spring.version</version>
  <exclusions>
    <exclusion>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
    </exclusion>
  </exclusions>
</dependency>
<dependency>
  <groupId>org.springframework.webflow</groupId>
  <artifactId>spring-js-resources</artifactId>
  <version>2.2.1.RELEASE</version>
</dependency>
<dependency>
  <groupId>commons-digester</groupId>
  <artifactId>commons-digester</artifactId>
  <version>2.0</version>
  <exclusions>
    <exclusion>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
    </exclusion>
  </exclusions>
</dependency>
<dependency>
  <groupId>commons-fileupload</groupId>
  <artifactId>commons-fileupload</artifactId>
  <version>1.2.1</version>
  <exclusions>
    <exclusion>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
    </exclusion>
  </exclusions>
</dependency>
<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>jstl</artifactId>
  <version>1.2</version>
</dependency>
<dependency>
  <groupId>javax.el</groupId>
  <artifactId>el-api</artifactId>
  <version>1.0</version>
  <scope>provided</scope>
</dependency>
<dependency>
  <groupId>joda-time</groupId>
  <artifactId>joda-time</artifactId>
  <version>1.6</version>
</dependency>
<dependency>
  <groupId>javax.servlet.jsp</groupId>
  <artifactId>jsp-api</artifactId>
  <version>2.1</version>
  <scope>provided</scope>
</dependency>
<dependency>
  <groupId>commons-codec</groupId>
  <artifactId>commons-codec</artifactId>
  <version>1.4</version>
</dependency>
<dependency>
  <groupId>org.apache.tiles</groupId>
  <artifactId>tiles-core</artifactId>
  <version>2.2.1</version>
  <exclusions>
    <exclusion>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
    </exclusion>
  </exclusions>
</dependency>
<dependency>
  <groupId>org.apache.tiles</groupId>
  <artifactId>tiles-jsp</artifactId>
  <version>2.2.1</version>
</dependency>
<dependency>
  <groupId>commons-lang</groupId>
  <artifactId>commons-lang</artifactId>
  <version>2.6</version>
</dependency>

persistence.xml 看起来像这样:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  version="1.0"
  xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
>
  <persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <class>sr.qualogy.hakrinbank.entities.BroadcastMessage</class>
    <properties>
      <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
      <property name="hibernate.hbm2ddl.auto" value="create"/>
      <property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy"/>
      <property name="hibernate.connection.charSet" value="UTF-8"/>
    </properties>
  </persistence-unit>
</persistence>

当我运行ClientHarness.main()时,我遇到了一个错误:

java.lang.UnsupportedOperationException:用户必须提供 JDBC 连接。

谁能告诉我我做错了什么?

【问题讨论】:

您是否配置了 PropertyPlaceholder? 是的。见代码: 我在配置 Spring 时出错。在主类中,我更改了以下代码: BroadcastMessageDao broadcastMessageDao = (BroadcastMessageDao) appContext.getBean("broadcastMessageDao");在我的 applicationContext 中,我将 bean 更改为: 但是现在我收到一个错误:java.lang.UnsupportedOperationException:用户必须提供 JDBC 连接 您的意思是在您的 entityManagerFactory 定义中取消注释数据源属性行后,您仍然有同样的错误? 是的,取消注释数据源属性行后,我得到 java.lang.UnsupportedOperationException:用户必须提供 JDBC 连接 【参考方案1】:

我刚刚意识到你有以下几点:

BroadcastMessageDao broadcastMessageDao = new BroadcastMessageDaoImpl();

在使用 spring 时你不应该这样做,这样你就不会得到一个 spring 管理的 bean,因此它的任何属性都不会被设置。您应该改用appContext.getBean(..)。不确定这是否会解决您的所有问题,但绝对是错误的。

如果更改后仍然有错误,请编辑您的问题并添加最新版本的文件以及错误的最新完整堆栈跟踪。

【讨论】:

你是对的。这是问题之一。我已经解决了用户必须提供 JDBC 连接。我会问另一个问题,在那里发布答案,因为我没有看到编辑选项。感谢您的帮助!

以上是关于无法使用 JPA 2.0、Spring 2.5.6、Hibernate 3.6.1 和 Maven 在 HSQLDB 中持久化的主要内容,如果未能解决你的问题,请参考以下文章

spring.jpa.hibernate.ddl-auto=create 在带有 SpringBoot 2.0 的 Hibernate 5 中不起作用

映射异常:在 JPA 2.0 中外部化命名本机查询时无法读取 XML

使用 Spring 数据 JPA 的 Spring Boot:无法提取 ResultSet

无法懒惰地初始化角色集合,..无法初始化代理 - 无会话 - JPA + SPRING

无法将 Spring Data MongoDB + Spring Data JPA 与 Spring Boot 一起使用

Spring Boot + Spring Data JPA + 事务无法正常工作