遇到如下问题:
在浏览器显示getSession().save(…)这句一直报nullException.
首先肯定不是getSession的问题,参考网上的用法都是这样使用的,getSession()而且代码是自动生成的(在hibernateSessionFactory.java中)。
于是去看看myeclipse的Console错误,配置文件错误:
org.hibernate.InvalidMappingException: Could not parse mapping document from resource hibernate/Plus.hbm.xml
进而去查看配置文件×××.hbm.xml,原来使用了composite-id这个属性。
查看如下资料:
<composite-id name="propertyName" class="ClassName" unsaved-value="undefined|any|none" access="field|property|ClassName" node="element-name|." > <key-property name="propertyName" type="typename" column="column_name"/> <key-many-to-one name="propertyName class="ClassName" column="column_name"/> ...... </composite-id>
For a table with a composite key, you may map multiple properties of the class as identifier properties. The <composite-id> element accepts <key-property> property mappings and <key-many-to-one> mappings as child elements.
如果表使用联合主键,你可以映射类的多个属性为标识符属性。 <composite-id>元素接受<key-property> 属性映射和<key-many-to-one>属性映射作为子元素。
<composite-id> <key-property name="medicareNumber"/> <key-property name="dependent"/> </composite-id>
你的持久化类必须重载equals()和 hashCode()方法,来实现组合的标识符的相等判断。 实现Serializable接口也是必须的。
不幸的是,这种组合关键字的方法意味着一个持久化类是它自己的标识。除了对象自己之外, 没有什么方便的“把手”可用。你必须自己初始化持久化类的实例,在使用组合关键字load() 持久化状态之前,必须填充他的联合属性。我们会在第 9.4 节 “组件作为联合标识符(Components as composite identifiers)”章中说明一种 更加便捷的方法,把联合标识实现为一个独立的类,下面描述的属性只对这种备用方法有效:
参考:http://www.makechm.com/chmbook/0/3069-2999-2797-0370-4931.html
=======================================================
org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [hibernate.Plus#hibernate.PlusId@1fbbcf6]
getSession() 获得的是原始的sessionFactory,每次你必须自己维护session如结束后你必须关闭session。如果是hibernate中进行数据库操作,你获得是原始的hibernate style和excepttion。
=====================================================
随后查看了getSession和getHibernateTemplate 使用上的区别:
http://blog.csdn.net/jianw2007/archive/2009/03/13/3986596.aspx
http://blog.csdn.net/fenixshadow/archive/2007/09/26/1802277.aspx
完整的实例:
http://www.iteye.com/topic/6629