Struts2(+Hibernate)个人踩坑记录 使用idea连接数据库 在Struts框架实现的基础上添加Hibernate框架
在struts2框架中整合hibernate框架时候,遇到了或多或少的问题现在总结如下:
测试Struts2+hibernate是否生效
- 在使用注解进行实体类的映射时候我们需要注意的是在使用@Entity的时候我们应当使用的是:javax.persistence.Entity的包下的。
- 在使用注解的时候只需要在Id(可自动增加的id)上添加注解即可
- 在配置hibernate.cfg.xml文件的时候我们应当注意的是该文件可以通过:file(idea左上角)-àproject.structure--àModules(点击加号+添加Hibernate框架)(详细操作见图1)—>而后点击右下角的apply 即可。(会自动生成)
图一
- hibernate文件的配置:(代码展示)
-
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.url">jdbc:mysql://localhost:3306/testhibernate</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property>
<property name="connection.username">root</property>
<property name="connection.password"></property>
<mapping class="testH.User"/>
<!-- <property name="connection.username"/> -->
<!-- <property name="connection.password"/> -->
<!-- DB schema will be updated if needed -->
<!-- <property name="hbm2ddl.auto">update</property> -->
</session-factory>
</hibernate-configuration>
6编写测试类(推荐在运行框架之前进行test)(使用main方法的测试类,测试Hibernate框架和Struts2框架集成是否生效)
package test; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import testH.User; public class TestConnection { public static void main(String[] args) { Configuration configuration = new Configuration(); configuration.configure("hibernate.cfg.xml"); SessionFactory sessionFactory = configuration.buildSessionFactory(); Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); User user = new User(); user.setId(2); user.setUser_name("WYY"); user.setUser_password("123456"); session.save(user); transaction.commit(); session.close(); System.out.println("Success saved!"); } }
.7.运行成功(截图):
一般在Java版本是9及以上的时候(查看java版本:命令行输入:java –version即可)会出现错误:
java.lang.ClassNotFoundException: javax.xml.bind.JAXBException
此时需要进行相关jar包的下载:
javax.activation-1.2.0.jar
http://search.maven.org/remotecontent?filepath=com/sun/activation/javax.activation/1.2.0/javax.activation-1.2.0.jar
jaxb-api-2.3.0.jar
http://search.maven.org/remotecontent?filepath=javax/xml/bind/jaxb-api/2.3.0/jaxb-api-2.3.0.jar
jaxb-core-2.3.0.jar
http://search.maven.org/remotecontent?filepath=com/sun/xml/bind/jaxb-core/2.3.0/jaxb-core-2.3.0.jar
jaxb-impl-2.3.0.jar
http://search.maven.org/remotecontent?filepath=com/sun/xml/bind/jaxb-impl/2.3.0/jaxb-impl-2.3.0.jar
在下载后:点击file(idea右上角)——>project structure->点击libraries(完成上边jar包的引入,即可运行成功)
测试整合后的SH框架是否生效
需要注意的地方是
- 应该注意的在struts2框架下面如果采用上述方式引入jar包,则会出现异常(java.lang.NoClassDefFoundError: org/hibernate/cfg/Configuration)表示无法加载配置文件。
此时,就是会导致程序出现断点,值得注意的是如果chrom没有启动开发者模式很难发现此种错误,并且idea中的debug控制台不会出现相关的报错,这一点需要注意,是因为相关的jar包找不到,此时解决办法就是,我们应当将原来的导入的jar包添加到web-inf文件里面的lib文件夹下面(注意右键单击添加的jar包选择(add as libraries))。
- 在实现编辑方法的时候,我遇到了一个很棘手的问题:会出现can’t set XXX on XX 表示的是在某一个Action类中不可以将前端的值设置到其中的一些属性中(一般原因是前端设置的属性和后端的名称不对应;或者是在后端的action类中没有设置你想要赋值属性的getter和setter方法(这一点很容易忘掉,一定注意))
- 最重要的一点是:不管我的bookaction类是有多么对但是最终还是出现了类似于:No result or input 的错误,这一点我看来是由于验证器的存在使得在执行action类的时候验证器是会自动检测的,一旦检测不成功会出现某一个action类中的相关方法Method根本不执行的情况,我的解决办法是:删除BookAction-validation.xml配置文件,并且删除在struts2.xml中的<action name=”Book_*_Action.action” class=”a_action.BookAction” method=”{1}”></action>
中的其中的一个:<result name=”input”>/XXX.jsp</result>
即可。但是这样的做法我们并不提倡,因为我们注意到的这样的做法虽然可以解决某些action中的方法不执行的情况,所以最好的解决办法是重新定一个新的action然后再struts.xml中重新配置,使得增加、删除、修改的相关操作在该action类中执行,(在定义新的action的时候我们提倡继承ActionSupport类+实现ModelDriven类,注意不要忘了生成getter和setter方法),这里再啰嗦两句就是注意前端的提交文件的时候应当将form 表单的enctype设置成multipart/form-data。
enctype="multipart/form-data"
-
我们使用MySQL数据库的自动增加的时候我遇到了Invalid default value for “XX”,这一点原因是xx设置成主键的时候,如果我们在使用navicat操作MySQL数据库的时候我们需要注意的是自动递增勾选和默认值是否填充只可以选择一个:
2.再来介绍一下idea连接数据库的步骤:
第一步:打开工程,点击最右边的Database:
第二步:点击打卡页面左上角的加号(+)--à然后选择第一个Data Source—>MySQL,点击MySQL。
第三步:到达当前页面之后,我们需要输入自己的MySQL数据库信息,其中的name属性是类似与在Navicate中的连接名(随便起就好),配置完成后我们点击“Test Connection”按钮,看到Successful Details 表示连接成功(如下图)。
配置自己的MySQL数据库的信息
试是否生效(测试成功提示信息)