spring+hibernate hbm2ddl.auto 的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring+hibernate hbm2ddl.auto 的问题相关的知识,希望对你有一定的参考价值。

spring+hibernate这是我的配置文件 <bean id="dataSourceByControlCenter" class="org.logicalcobwebs.proxool.ProxoolDataSource" destroy-method="close">
<property name="driver" value="$center.db.driver"/>
<property name="driverUrl" value="$center.db.url"/>
.............................
<property name="hbm2ddl.auto" value="update"/>
</bean>
我一加上这句 <property name="hbm2ddl.auto" value="update"/>程序就会出异常
Caused by: org.springframework.beans.NotReadablePropertyException: Invalid property 'hbm2ddl' of bean class [org.logicalcobwebs.proxool.ProxoolDataSource]: Bean property 'hbm2ddl' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?

这个不是配在datasource里的,而是配在sessionfactory里

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">

<!-- 加载驱动 -->
<property name="driverClass" value="$jdbc.driverClassName" />

<!-- database url -->
<property name="jdbcUrl" value="$jdbc.url" />

<!-- database username -->
<property name="user" value="$jdbc.username" />

<!-- database password -->
<property name="password" value="$jdbc.password" />

<!-- 连接关闭时默认将所有未提交的操作回滚。默认为false -->
<property name="autoCommitOnClose" value="$jdbc.autoCommitOnClose" />

<!-- 连接池中保留的最小连接数 -->
<property name="minPoolSize" value="$jdbc.minPoolSize" />

<!-- 连接池中保留的最大连接数。默认为15 -->
<property name="maxPoolSize" value="$jdbc.maxPoolSize" />

<!-- 初始化时获取的连接数,取值应在minPoolSize与maxPoolSize之间。默认为3 -->
<property name="initialPoolSize" value="$jdbc.initialPoolSize" />

<!-- 最大空闲时间,超过空闲时间的连接将被丢弃。为0或负数则永不丢弃。默认为0秒 -->
<property name="maxIdleTime" value="$jdbc.maxIdleTime" />

<!-- 当连接池中的连接用完时,C3P0一次性创建新连接的数目。默认为3 -->
<property name="acquireIncrement" value="$jdbc.acquireIncrement" />

<!-- 定义在从数据库获取新连接失败后重复尝试获取的次数,默认为30 -->
<property name="acquireRetryAttempts" value="$jdbc.acquireRetryAttempts" />

<!-- 当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出SQLException,如设为0则无限期等待。单位毫秒,默认为0 -->
<property name="checkoutTimeout" value="$jdbc.checkoutTimeout" />

</bean>

<!-- 创建sessionFactory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource">
<ref local="dataSource" />
</property>
<property name="namingStrategy">
<bean class="org.hibernate.cfg.ImprovedNamingStrategy" />
</property>
<property name="hibernateProperties">
<props>

<!-- 数据库方言 -->
<prop key="hibernate.dialect">$hibernate.dialect</prop>

<!-- 是否在控制台输出sql语句 -->
<prop key="hibernate.show_sql">$hibernate.showSQL</prop>

<!-- 是否在控制台格式化sql语句 -->
<prop key="hibernate.format_sql">$hibernate.formatSQL</prop>

<!-- 自动创建修改表 -->
<!-- <prop key="hibernate.hbm2ddl.auto">$hibernate.hbm2ddl</prop> -->
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
<prop key="hibernate.cache.provider_configuration_file_resource_path">classpath:ehcache-hibernate-local.xml</prop>
<prop key="hibernate.c3p0.max_statements">50</prop>
</props>
</property>

<property name="packagesToScan">
<value></value>
</property>

</bean>
参考技术A 意思是说没有这个属性,检查一下是否正确

Spring4.* 中整合 Hibernate

1. Spring 整合 Hibernate 整合什么 ?

1). 有 IOC 容器来管理 Hibernate 的 SessionFactory
2). 让 Hibernate 使用上 Spring 的声明式事务

2. 整合步骤:

1). 加入 hibernate
①. jar 包
②. 添加 hibernate 的配置文件: hibernate.cfg.xml
③. 编写了持久化类对应的 .hbm.xml 文件。

2). 加入 Spring
①. jar 包

spring-aop-4.0.0.RELEASE.jar
spring-aspects-4.0.4.RELEASE.jar

spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELEASE.jar
spring-core-4.0.0.RELEASE.jar
spring-expression-4.0.0.RELEASE.jar
commons-logging-1.2.jar

②. 加入 Spring 的配置文件

3). 整合.

3. 编写代码

 

整合工程目录结构如下图所示:

 

引用到的jar包如下:

 

spring的配置文件:applicationContext.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xmlns:context="http://www.springframework.org/schema/context"
 5     xmlns:tx="http://www.springframework.org/schema/tx"
 6     xmlns:aop="http://www.springframework.org/schema/aop"
 7     xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
 8         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
 9         http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
10         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
11     
12     <!-- 配置自动扫描的包 -->
13     <context:component-scan base-package="com.atguigu.spring.hibernate"></context:component-scan>
14     
15     <!-- 配置数据源 -->
16     <!-- 导入资源文件 -->
17     <context:property-placeholder location="classpath:db.properties"/>
18     
19     <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
20         <property name="user" value="${jdbc.user}"></property>
21         <property name="password" value="${jdbc.password}"></property>
22         <property name="driverClass" value="${jdbc.driverClass}"></property>
23         <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
24 
25         <property name="initialPoolSize" value="${jdbc.initPoolSize}"></property>
26         <property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property>
27     </bean>
28     
29     <!-- 配置 Hibernate 的 SessionFactory 实例: 通过 Spring 提供的 LocalSessionFactoryBean 进行配置 -->
30     <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
31         <!-- 配置数据源属性 -->
32         <property name="dataSource" ref="dataSource"></property>
33         <!-- 配置 hibernate 配置文件的位置及名称 -->
34         <!--  
35         <property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
36         -->
37         <!-- 使用 hibernateProperties 属相来配置 Hibernate 原生的属性 -->
38         <property name="hibernateProperties">
39             <props>
40                 <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
41                 <prop key="hibernate.show_sql">true</prop>
42                 <prop key="hibernate.format_sql">true</prop>
43                 <prop key="hibernate.hbm2ddl.auto">update</prop>
44             </props>
45         </property>
46         <!-- 配置 hibernate 映射文件的位置及名称, 可以使用通配符 -->
47         <property name="mappingLocations" 
48             value="classpath:com/atguigu/spring/hibernate/entities/*.hbm.xml"></property>
49     </bean>
50 
51     <!-- 配置 Spring 的声明式事务 -->
52     <!-- 1. 配置事务管理器 -->
53     <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
54         <property name="sessionFactory" ref="sessionFactory"></property>
55     </bean>
56 
57     <!-- 2. 配置事务属性, 需要事务管理器 -->
58     <tx:advice id="txAdvice" transaction-manager="transactionManager">
59         <tx:attributes>
60             <tx:method name="get*" read-only="true"/>
61             <tx:method name="purchase" propagation="REQUIRES_NEW"/>
62             <tx:method name="*"/>
63         </tx:attributes>
64     </tx:advice>
65 
66     <!-- 3. 配置事务切点, 并把切点和事务属性关联起来 -->
67     <aop:config>
68         <aop:pointcut expression="execution(* com.atguigu.spring.hibernate.service.*.*(..))" 
69             id="txPointcut"/>
70         <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
71     </aop:config>
72 
73 </beans>

 

hibernate配置文件:hibernate.cfg.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE hibernate-configuration PUBLIC
 3         "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
 4         "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
 5 <hibernate-configuration>
 6     <session-factory>
 7     
 8         <!-- 配置 hibernate 的基本属性 -->
 9         <!-- 1. 数据源需配置到 IOC 容器中, 所以在此处不再需要配置数据源 -->
10         <!-- 2. 关联的 .hbm.xml 也在 IOC 容器配置 SessionFactory 实例时在进行配置 -->
11         <!-- 3. 配置 hibernate 的基本属性: 方言, SQL 显示及格式化, 生成数据表的策略以及二级缓存等. -->
12         <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
13 
14         <property name="hibernate.show_sql">true</property>
15         <property name="hibernate.format_sql">true</property>
16         
17         <property name="hibernate.hbm2ddl.auto">update</property>
18         
19         <!-- 配置 hibernate 二级缓存相关的属性. -->
20                 
21     </session-factory>
22 </hibernate-configuration>

数据库配置文件:db.properties

1 jdbc.user=root
2 jdbc.password=123456
3 jdbc.driverClass=com.mysql.jdbc.Driver
4 jdbc.jdbcUrl=jdbc:mysql:///spring
5 
6 jdbc.initPoolSize=5
7 jdbc.maxPoolSize=10
8 #...

DAO层接口文件:BookShopDao

 1 package com.lltse.spring.hibernate.dao;
 2 
 3 public interface BookShopDao {
 4 
 5     //根据书号获取书的单价
 6     public int findBookPriceByIsbn(String isbn);
 7     
 8     //更新数的库存. 使书号对应的库存 - 1
 9     public void updateBookStock(String isbn);
10     
11     //更新用户的账户余额: 使 username 的 balance - price
12     public void updateUserAccount(String username, int price);
13 }

DAO层接口实现类:

Entity:Account

 1 package com.lltse.spring.hibernate.entities;
 2 
 3 public class Account {
 4 
 5     private Integer id;
 6     private String username;
 7     private int balance;
 8 
 9     public Integer getId() {
10         return id;
11     }
12 
13     public void setId(Integer id) {
14         this.id = id;
15     }
16 
17     public String getUsername() {
18         return username;
19     }
20 
21     public void setUsername(String username) {
22         this.username = username;
23     }
24 
25     public int getBalance() {
26         return balance;
27     }
28 
29     public void setBalance(int balance) {
30         this.balance = balance;
31     }
32 
33 }

Book

 1 package com.lltse.spring.hibernate.entities;
 2 
 3 public class Book {
 4 
 5     private Integer id;
 6     private String bookName;
 7     private String isbn;
 8     private int price;
 9     private int stock;
10 
11     public Integer getId() {
12         return id;
13     }
14 
15     public void setId(Integer id) {
16         this.id = id;
17     }
18 
19     public String getBookName() {
20         return bookName;
21     }
22 
23     public void setBookName(String bookName) {
24         this.bookName = bookName;
25     }
26 
27     public String getIsbn() {
28         return isbn;
29     }
30 
31     public void setIsbn(String isbn) {
32         this.isbn = isbn;
33     }
34 
35     public int getPrice() {
36         return price;
37     }
38 
39     public void setPrice(int price) {
40         this.price = price;
41     }
42 
43     public int getStock() {
44         return stock;
45     }
46 
47     public void setStock(int stock) {
48         this.stock = stock;
49     }
50 
51 }

hibernate对实体的映射文件:

Account.hbm.xml

 1 <?xml version="1.0"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 4 
 5 <hibernate-mapping>
 6     <class name="com.lltse.spring.hibernate.entities.Account" table="SH_ACCOUNT">
 7         
 8         <id name="id" type="java.lang.Integer">
 9             <column name="ID" />
10             <generator class="native" />
11         </id>
12         
13         <property name="username" type="java.lang.String">
14             <column name="USERNAME" />
15         </property>
16         
17         <property name="balance" type="int">
18             <column name="BALANCE" />
19         </property>
20         
21     </class>
22 </hibernate-mapping>

Book.hbm.xml

 1 <?xml version="1.0"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 4 
 5 <hibernate-mapping>
 6     <class name="com.lltse.spring.hibernate.entities.Book" table="SH_BOOK">
 7     
 8         <id name="id" type="java.lang.Integer">
 9             <column name="ID" />
10             <generator class="native" />
11         </id>
12         
13         <property name="bookName" type="java.lang.String">
14             <column name="BOOK_NAME" />
15         </property>
16         
17         <property name="isbn" type="java.lang.String">
18             <column name="ISBN" />
19         </property>
20         
21         <property name="price" type="int">
22             <column name="PRICE" />
23         </property>
24         
25         <property name="stock" type="int">
26             <column name="STOCK" />
27         </property>
28         
29     </class>
30 </hibernate-mapping>

自定义异常:

BookStockException.java

 1 package com.lltse.spring.hibernate.exceptions;
 2 
 3 public class BookStockException extends RuntimeException{
 4 
 5     /**
 6      * 
 7      */
 8     private static final long serialVersionUID = 1L;
 9 
10     public BookStockException() {
11         super();
12         // TODO Auto-generated constructor stub
13     }
14 
15     public BookStockException(String message, Throwable cause,
16             boolean enableSuppression, boolean writableStackTrace) {
17         super(message, cause, enableSuppression, writableStackTrace);
18         // TODO Auto-generated constructor stub
19     }
20 
21     public BookStockException(String message, Throwable cause) {
22         super(message, cause);
23         // TODO Auto-generated constructor stub
24     }
25 
26     public BookStockException(String message) {
27         super(message);
28         // TODO Auto-generated constructor stub
29     }
30 
31     public BookStockException(Throwable cause) {
32         super(cause);
33         // TODO Auto-generated constructor stub
34     }
35 
36     
37 }

UserAccountException.java

package com.lltse.spring.hibernate.exceptions;

public class UserAccountException extends RuntimeException{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public UserAccountException() {
        super();
        // TODO Auto-generated constructor stub
    }

    public UserAccountException(String message, Throwable cause,
            boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
        // TODO Auto-generated constructor stub
    }

    public UserAccountException(String message, Throwable cause) {
        super(message, cause);
        // TODO Auto-generated constructor stub
    }

    public UserAccountException(String message) {
        super(message);
        // TODO Auto-generated constructor stub
    }

    public UserAccountException(Throwable cause) {
        super(cause);
        // TODO Auto-generated constructor stub
    }

    
    
}

service 接口:

BookShopService.java