Hibernate中一对一关联的行为?

时间:2011-10-23 12:53:38

标签: hibernate

以下是我的完整代码

这是cfg文件

<hibernate-configuration>
<session-factory>
    <!-- Database connection settings -->
    <property     name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
    <property   name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:xe</property>
    <property name="hibernate.connection.username">MyProject1</property>
    <property name="hibernate.connection.password">tingtong</property>
    <property name="hibernate.default_schema">MyProject1</property>


    <!-- JDBC connection pool (use the built-in) -->
    <property name="connection.pool_size">1</property>

    <!-- SQL dialect -->
    <property name="hibernate.dialect">org.hibernate.dialect.OracleDialect</property>

      <property name="hibernate.hbm2ddl.auto" >update</property>

    <!-- Echo all executed SQL to stdout -->
    <property name="show_sql">true</property>

    <!-- Mapping files -->
    <mapping resource="Person.hbm.xml"/>
   </session-factory>
 </hibernate-configuration>

以下是映射文件

<hibernate-mapping>

 <class name="com.daasl.Person" table="person">
  <id name="id" type="int">
     <generator class="increment"/>
  </id>

  <property name="name" column="cname" type="string"/>
  <one-to-one name="address" class="com.daasl.Address" property-ref="personId"   cascade="all"/>

  </class>


 <class name="com.daasl.Address" table="Address">
  <id name="id" type="int">
     <generator class="increment"/>
  </id>

    <!--for one to one -->
      <property name="personId"  type="int"/> 
  <property name="addressLine1"  type="string"/>

 </hibernate-mapping>

下面是人物价值对象

public class Person implements Serializable {

private int id;
private String name;
//private int addressId;
private Address address;
// getter seeter for each field
}

下面是地址值对象

 public class Address {

private int id;
private int personId;
private String addressLine1;
// getter seeter for each field

}

以下是main方法的代码段

tx = session.beginTransaction();
            person = (Person)session.get(Person.class, 4);

        // Create a Person object and save it
        Person p1 = new Person();
        p1.setName("Scott");
        Address add1= new Address();
        add1.setAddressLine1("NY1");
        p1.setAddress(add1);
        session.save(p1);


     //   p1.setName("mohit1");
        // Retrieve the person objects
         person = (Person)session. get(Person.class,1);

        tx.commit();
        tx = null;

如上面的代码,当我保存Person对象时,我希望地址对象也与相应的personid一起保存。 当我在上面运行时,程序personid在地址表内的personid列中显示为0。根据我的理解personid应该与person table id值一起插入。对吗?

我想知道的第二件事是:one to one映射是否会创建外来子密钥关系。如上例所示我期望地址表内的personid列应该指向person表的主键,即id列。 但它没有在地址表的personid列上创建任何外键约束。

我在这里遗漏了什么

1 个答案:

答案 0 :(得分:3)

是的,你错过了什么。像hibernate这样的ORM的目的是能够实现对象之间的关联。

使关联单向,并从地址中删除personId字段,或使其成双向,并将personId字段替换为person字段,类型为Person }。在这种情况下,关联的一方(person.address方)必须与另一方(adress.person方)相反。

这在Hibernate参考文档中有所描述。阅读。请参阅http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#assoc-unidirectional-121获取单向一对一和http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#assoc-bidirectional-121以获得双向一对一。