hibernate composite-id

遇到如下问题:

 

在浏览器显示getSession().save(…)这句一直报nullException.

首先肯定不是getSession的问题,参考网上的用法都是这样使用的,getSession()而且代码是自动生成的(hibernateSessionFactory.java)

于是去看看myeclipseConsole错误,配置文件错误:

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)”章中说明一种 更加便捷的方法,把联合标识实现为一个独立的类,下面描述的属性只对这种备用方法有效:

  • name (可选):一个组件类型,持有复合标识(参见下一节)。
  • class (可选 - 默认为通过反射(reflection)得到的属性类型) : 作为联合标识的组件类名(参见下一节)
  • unsaved-value (可选 - 默认为 undefined): 如果设置为any,就表示瞬时(transient)实例应该被重新初始化,或者如果 设置为none,则表示该实例是脱管对象。最好在所有的情况下都保持默认的值。

参考: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 styleexcepttion

 

=====================================================

随后查看了getSessiongetHibernateTemplate 使用上的区别:

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

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值