此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
楼主【zhangshudo】截止到2008-07-18 23:36:07的历史汇总数据(不包括此帖):
发帖的总数量:2                        发帖的总分数:40                       每贴平均分数:20                       
回帖的总数量:7                        得分贴总数量:3                        回帖的得分率:42%                      
结贴的总数量:2                        结贴的总分数:40                       
无满意结贴数:0                        无满意结贴分:0                        
未结的帖子数:0                        未结的总分数:0                        
结贴的百分比:100.00%               结分的百分比:100.00%                  
无满意结贴率:0.00  %               无满意结分率:0.00  %                  
敬礼!

解决方案 »

  1.   

    Person.hbm.xml<?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" ><hibernate-mapping package="net.M2O">
    <class
    name="Person"
    table="person"

    >
    <meta attribute="sync-DAO">false</meta>
    <id
    name="Id"
    type="integer"
    column="personid"
    >
    <generator class="increment"/>
    </id> <property
    name="Name"
    column="name"
    type="string"
    not-null="false"
    length="10"
    />
    <many-to-one name="Address"  column="address_pid"></many-to-one>   
    </class>
    </hibernate-mapping>
      

  2.   

    Address.hbm.xml<?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" ><hibernate-mapping package="net.M2O">
    <class
    name="Address"
    table="address"
    >
    <meta attribute="sync-DAO">false</meta>
    <id
    name="Id"
    type="integer"
    column="addressid"
    >
    <generator class="increment"/>
    </id> <property
    name="Addressdatail"
    column="addressdatail"
    type="string"
    not-null="false"
    length="50"
    />
    </class>
    </hibernate-mapping>
      

  3.   

    Personpackage net.M2O;public class Person {

    private int Id;//人员id
    private String Name;//人员名字

    private Address address; //地址

    public Address getAddress()
    {
    return this.address;
    }

    public void setAddress(Address address)
    {
    this.address=address;
    }

    public int getId()
    {
    return this.Id;
    } public void setId(int id)
    {
    this.Id=id;
    }

    public String getName()
    {
    return Name;
    }

    public void setName(String name)
    {
    this.Name=name;
    }
    }
      

  4.   

    Address package net.M2O;
    public class Address {

    private int Id;//地址的id
    private String Addressdatail;//地址的信息public void setId(int id)
    {
    this.Id=id;
    }public int getId()
    {
    return Id;
    }public void setAddressdatail(String addressdetail)
    {
    this.Addressdatail=addressdetail;
    }public String getAddressdatail()
    {
    return Addressdatail;
    }}
      

  5.   

    测试主程序package net.M2O.action;import net.M2O.*;import org.hibernate.Session;
    import org.hibernate.Transaction;public class aaa { public static void main(String[] args) { Session sess=HibernateUtil.currentSession();//获得session
    Transaction tx=sess.beginTransaction();

    Address a=new Address();//new 地址
    a.setId(1);
    a.setAddressdatail("aaa");

    Person p=new Person();//new 人员
    p.setId(1);
    p.setName("tom");
    p.setAddress(a);//添加地址

    sess.save(p);
    tx.commit();
    sess.close();
    System.out.println("ok");
    }}
      

  6.   

    我运行测试主程序可以运行的,但是它只会写入person表,而address表没有数据.谁能告诉我,问题出在什么地方?万分感谢!
      

  7.   

    person表中有一个外键address_pid
    引用了address表中的主键,
    当你调用sess.save(p); 时
    hibernate会去查找address表中的主键id,
    但是你之前并没有调用sess.save(a);
    所以hibernate查不到,id会是空值。修改如下,加一句代码就行了。Address a=new Address();//new 地址 
    a.setId(1); 
    a.setAddressdatail("aaa"); sess.save(a);Person p=new Person();//new 人员 
    p.setId(1); 
    p.setName("tom"); 
    p.setAddress(a);//添加地址 sess.save(p); 
    tx.commit(); 这样修改之后,表中就会有数据了。
      

  8.   

    哦~谢谢,咖啡。我明白了~还是对hibernate的概念不是很清楚。我原来以为是p.setAddress(a)以后,只要保存Person对象就可以一起把Address对象保存。其实,它还是像用SQL保存一样。主表一句SQL,从表一句SQL。只是hibernate改成了对象的方式保存?
      

  9.   

    这里使用cascade吧?及联保存?
      

  10.   

    p.setAddress(a)可以一起保存Address对象。不过你要在Person.hbm.xml  中设置一下:
      <set name="Address" inverse="true" cascade="save-update">
        <key column="Address_ID" />
        <one-to-many class="net.M2O.Address" />
      </set>
    然后在测试主程序调用的时候是
    Transaction tx=sess.beginTransaction(); Address a=new Address();//new 地址 
    a.setId(1); 
    a.setAddressdatail("aaa"); Person p=new Person();//new 人员 
    p.setId(1); 
    p.setName("tom"); 
    p.getAddress().add(a);//添加地址 
    sess.save(p); 
    tx.commit(); 
    你可以试试看
      

  11.   

    cascade 呵呵。。级联啦。。