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?
<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
1 package com.lltse.spring.hibernate.service; 2 3 public interface BookShopService { 4 5 public 在 JUnit/Spring 测试期间触发 Hibernate 的 SchemaExport.execute (hbm2ddl.auto) 的原因是啥?Maven + Spring + Hibernate:hibernate3-maven-plugin hbm2ddl 失败,原因是“Caused by: java.lang.NullPointerEx
Maven 示例 - NullPointer 执行 hibernate3:hbm2ddl
Spring Boot 2.2.2 和“hibernate.hbm2ddl.auto=(create|create-drop|update|validate)”不起作用