`
ll_feng
  • 浏览: 383047 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

mvn and ssh融合问题及解决办法

    博客分类:
  • j2ee
阅读更多
通过maven融合ssh(struts2+spring2.5+hibernate3.3)是比较容易的事情。但也会出现一些问题需要注意的。
一、在tomcat启动时报错:
严重: Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in file [D:\lvlf\workspace\ssh\target\ssh\WEB-INF\classes\applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.IllegalAccessError: tried to access field org.slf4j.impl.StaticLoggerBinder.SINGLETON from class org.slf4j.LoggerFactory
...
Caused by: java.lang.IllegalAccessError: tried to access field org.slf4j.impl.StaticLoggerBinder.SINGLETON from class org.slf4j.LoggerFactory
...

原因分析:
jar文件版本冲突.从网上查询得知类: org.slf4j.impl.StaticLoggerBinder在slf4j-api 中是类的公有静态变量,而在slf4j-log4j12(slf4j-nop.jar, slf4j-simple.jar, slf4j-log4j12.jar, slf4j-jdk14.jar or logback-classic.jar其中之一)中确是私有变量
解决办法:
在类路径先将slf4j-api.jar 删除,再导入同版本的slf4j-api-1.5.6.jar 和slf4j-log4j12-1.5.6.jar 具体到maven上就是加上:
<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>slf4j-api</artifactId>
	<version>1.5.6</version>
</dependency>
<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>slf4j-log4j12</artifactId>
	<version>1.5.6</version>
</dependency>


二、注解驱动下的DAO无法继承HibernateDaoSupport类
可以在当前dao中为父类注入sessionFactory.如:
@Repository("userDao")
public class UserDaoHibernate extends HibernateDaoSupport implements UserDao {
	
	private SessionFactory sessionFactory;
	@Autowired  
	public void setSessionFactory0(SessionFactory sessionFactory){   
	  super.setSessionFactory(sessionFactory);   
	}


}


三、实体对象无法持久化
报错:org.springframework.orm.hibernate3.HibernateSystemException: Unknown entity:...
Caused by: org.hibernate.MappingException: Unknown entity: cn.lvlf.ssh.demo.model.User...
原因分析:如果工程里存在不同的spring版本,也可能报错。但我这里经排查应是配置的问题。
解决办法:
最终还是配置错误。原先的hibernate配置为:
<property name="packagesToScan" >
<list>
<value>cn.lvlf.ssh.demo.model.*</value>
</list>
</property>

其实就错在这里。packagesToScan是要指定包名的。而我这里cn.lvlf.ssh.demo.model下就是实体类了。没有包了。所以将“*”去掉即可。或是将*的位置前移一位:cn.lvlf.ssh.demo.*也可。
哎,困扰多天了。原来如此!



四、关于不能在mvn -o package时自动生成数据库的问题
原以为现在可以在spring配置文件里用packageToScan属性指定实体类了,就不再需要hibernate.cfg.xml中注册实体类了。其实不是这样。反复试验证实hibernate.cfg.xml文件必不可少。不过感觉代码运行期不关它的事。它只在运行maven的hibernate插件maven-hibernate-plugs运行时和HibernateTools运行实用得上。所以我们仍然需要将所有的实体注册到hibernate.cfg.xml中
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
		"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
		"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory name="sessionFactory">
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">1234</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
        <property name="hibernate.hbm2ddl.auto">create-drop</property>
        
        <mapping class="cn.lvlf.ssh.demo.model.User"/>
    </session-factory>
</hibernate-configuration>


另外,pom.xml中好象也不需要显示的指定hibernate.cfg.xml.
<plugin>
		        <groupId>org.codehaus.mojo</groupId>
		        <artifactId>hibernate3-maven-plugin</artifactId>
		        <version>2.2</version>
		        <executions>
		          <execution>
		            <phase>process-classes</phase>
		            <goals>
		              <goal>hbm2ddl</goal>
		            </goals>
		          </execution>
		        </executions>
		        <dependencies>
					<dependency>
						<groupId>mysql</groupId>
						<artifactId>mysql-connector-java</artifactId>
						<version>5.1.6</version>
					</dependency>
				</dependencies>
				<configuration>
					<components>
						<component>
							<name>hbm2ddl</name>
							<implementation>annotationconfiguration</implementation>
						</component>
					</components>
					<componentProperties>
						<drop>true</drop>
						<jdk5>true</jdk5>
						<skip>${maven.test.skip}</skip>
					</componentProperties>
				</configuration>
      		</plugin>


当当然也可以将hibernate.cfg.xml中的hibernate属性配置移植到一个专有文件中如,jdbc.properties
jdbc.driverClassName=${jdbc.driverClassName}
jdbc.url=${jdbc.url}
jdbc.username=${jdbc.username}
jdbc.password=${jdbc.password}


# Needed by Hibernate3 Maven Plugin defined in pom.xml
hibernate.dialect=${hibernate.dialect}
hibernate.hbm2ddl.auto=${hibernate.hbm2ddl.auto}
hibernate.connection.username=${jdbc.username}
hibernate.connection.password=${jdbc.password}
hibernate.connection.url=${jdbc.url}
hibernate.connection.driver_class=${jdbc.driverClassName}


那么,在maven-hibernate-plugin中就要加上如下配置了:
<componentProperties>
...				
<propertyfile>target/ssh/WEB-INF/classes/jdbc.properties</propertyfile>
...
</componentProperties>

这样,maven-hibernate-plugin就会去jdbc.properties中读取相关的hibernate属性并在自动搜索到的hibernate.cfg.xml中查找要处理的实体类了。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics