论坛首页 Java版 Hibernate

一对一中的问题:attempted to assign id from null one-to-...

浏览 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]

没有查出错误的原因,请教!
   
最后更新时间: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]
   
0 请登录后投票
最后更新时间:2004-07-28
我碰到了同样得问题,不知道楼上说得是什么意思,能不能具体一点,把代码贴处理说话?
   
0 请登录后投票
最后更新时间: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]
   
0 请登录后投票
最后更新时间:2004-08-03
我的理解one to one就是主键共享。要加一起加。要删一起删。
   
0 请登录后投票
最后更新时间: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才能保存.
   
0 请登录后投票
论坛首页 Java版 Hibernate

跳转论坛:
JavaEye推荐