Поведение Один в один в Hibernate? - PullRequest
0 голосов
/ 23 октября 2011

Ниже приведен мой полный код

Вот файл 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>

ниже находится объект Value

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

}

Ниже приведен фрагмент кода из основного метода

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 отображается как 0 в столбце personid внутри таблицы адресов. согласно моему пониманию personid должен быть вставлен со значением идентификатора таблицы личности. Правильно?

Второе, что я хотел бы знать: создает ли отображение one to one отношение внешнего-дочернего ключа. Как и в приведенном выше примере, я ожидал, что столбец personid внутри таблицы адресов должен указывать на первичный ключ таблицы person, т.е. на столбец id. Но это не создало никаких ограничений внешнего ключа для столбца personid таблицы адресов.

Я что-то здесь упустил

1 Ответ

3 голосов
/ 23 октября 2011

Да, вы что-то упустили.Смысл ORM, подобного hibernate, заключается в том, чтобы иметь возможность реализовывать ассоциации между объектами .

Либо сделайте ассоциацию однонаправленной, и удалите поле 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 для двунаправленных один-к-одному.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...