浏览 3110 次
|
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
最后更新时间:2004-05-28
Provider.hbm.xml
[code:1] <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"> <hibernate-mapping> <!--Define Department--> <class name="net.myhc.scm.po.Provider" table="SCM_PROVIDER" > <id name="id" column="PROVIDER_ID" > <generator class="identity"/> </id> <property name="name" type="string"> <column name="NAME" length="100" not-null="true" /> </property> </class> </hibernate-mapping> [/code:1] InvoiceInfo.hbm.xml [code:1] <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"> <hibernate-mapping> <!--Define Operator--> <class name="net.myhc.scm.po.InvoiceInfo" table="SCM_INVOICEINFO" > <id name="id" column="INVOICEINFO_ID" > <generator class="foreign"> <param name="property">provider</param> </generator> </id> <property name="name" type="string"> <column name="NAME" length="255"/> </property> <one-to-one name="provider" class="net.myhc.scm.po.Provider" constrained="true" /> </class> </hibernate-mapping> [/code:1] Provider与InvoiceInfo是一对一的关系,下面是方法代码: [code:1] Long id = null; Transaction tx = null; try { Session session = HibernateUtil.currentSession(); tx = session.beginTransaction(); Provider provider = new Provider(); provider.setName(name); InvoiceInfo invoiceInfo = new InvoiceInfo(); invoiceInfo.setProvider(provider); session.save(invoiceInfo); session.save(provider); tx.commit(); } catch (HibernateException ex) { System.out.println("ProviderManagement Add Commit Error: " + ex.getMessage()); try { if (tx != null) { tx.rollback(); } }catch (HibernateException ex1) {} } finally { HibernateUtil.closeSession(); } return id; [/code:1] 执行该方法时,触发HibernateException,Message是: [code:1] ProviderManagement Add Commit Error: attempted to assign id from null one-to-one property: provider [/code:1] 没有查出错误的原因,请教! 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
最后更新时间:2004-05-29
one-to-one不需要通过额外字段来实现关联
而是通过共享主键来实现的 所以你的程序需要改动 [code:1] Provider provider = new Provider(); provider.setName(name); session.save(provider); InvoiceInfo invoiceInfo = new InvoiceInfo(); invoiceInfo.setProvider(provider); session.save(invoiceInfo); [/code:1] 因为你在save(invoiceInfo)的时候,provider的id为null,无法建立one-to-one关联[/code] |
|
| 返回顶楼 | |
|
最后更新时间:2004-07-28
我碰到了同样得问题,不知道楼上说得是什么意思,能不能具体一点,把代码贴处理说话?
|
|
| 返回顶楼 | |
|
最后更新时间:2004-07-28
[quote]代码:
[code:1] Long id = null; Transaction tx = null; try { Session session = HibernateUtil.currentSession(); tx = session.beginTransaction(); Provider provider = new Provider(); provider.setName(name); InvoiceInfo invoiceInfo = new InvoiceInfo(); invoiceInfo.setProvider(provider); session.save(invoiceInfo); session.save(provider); tx.commit(); } catch (HibernateException ex) { System.out.println("ProviderManagement Add Commit Error: " + ex.getMessage()); try { if (tx != null) { tx.rollback(); } }catch (HibernateException ex1) {} } finally { HibernateUtil.closeSession(); } return id; [/code:1] [/quote] 其中 [code:1] session.save(invoiceInfo); session.save(provider); [/code:1] 应改成 [code:1] session.save(provider); session.save(invoiceInfo); [/code:1] 原因楼上的说了,先有provider才有invoiceInfo[/quote] |
|
| 返回顶楼 | |
|
最后更新时间:2004-08-03
我的理解one to one就是主键共享。要加一起加。要删一起删。
|
|
| 返回顶楼 | |
|
最后更新时间:2004-08-06
在文档中说的清楚, one-to-one有两种映射方式, 一种是共享主键, 一种是使用外键约束. 如
create table Foo ( id number(2,0), ... ) create table Bar( id number(2,0) foo_id number(2,0) unique ) 共享主键映射时有依赖关系, 比如要先有Foo对象才能有Bar对象, 所以Foo对象必须在Bar对象之前保存,或者在Bar映射文件中加上对Foo对象的级连增加, 即 cascade="save-update". 出现上面的错误提示, 是因为Providor对象还没有被保存, 没有给ID赋值. 而另一个对象需要这个ID才能保存. |
|
| 返回顶楼 | |





