shangshan3353
2009-07-11 22:10
浏览 268
已采纳

有关hibernate一对一主键关联映射的问题

constrained="true" 和 这2个设置有什么区别啊, 不是已经表明他是共享主键吗,constrained="true" 也表明存在主键约束,那这2个区别是什么啊

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

5条回答 默认 最新

  • fdsafds 2009-07-11 23:28
    已采纳

    例如user与room表格,可以如下建立:

    [code="sql"]CREATE TABLE user (
    id INT(11) NOT NULL auto_increment PRIMARY KEY,
    name VARCHAR(100) NOT NULL default ''
    );

    CREATE TABLE room (
    id INT(11) NOT NULL auto_increment PRIMARY KEY,
    address VARCHAR(100) NOT NULL default ''
    );[/code]

    User类别与Room类别的设计使用 一对一(唯一外键关联) 中的设计即可,接着在User.hbm.xml方面如下设计:

    User.hbm.xml
    [code="xml"]<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> [/code]

    在Room.hbm.xml的设计方面如下:

    Room.hbm.xml
    [code="xml"]<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> user [/code][color=red]在Room的id主键上,使用foreign表示与外键共享主键,也就是与User实体共享主键,而constrained设定为true,表示约束room的主键必须与user中对应资料的主键相同。[/color]

    一个储存的实例如下:

    [code="java"]User user1 = new User();
    user1.setName("bush");
    Room room1 = new Room();
    room1.setAddress("NTU-M8-419");

    // 互相设定关联
    user1.setRoom(room1);
    room1.setUser(user1);

    User user2 = new User();
    user2.setName("caterpillar");
    Room room2 = new Room();
    room2.setAddress("NTU-M8-418");

    // 互相设定关联
    user2.setRoom(room2);
    room2.setUser(user2);

    Session session = sessionFactory.openSession();
    Transaction tx = session.beginTransaction();

    session.save(user1);
    session.save(user2);

    tx.commit();
    session.close();[/code]

    已采纳该答案
    打赏 评论
  • wanghaolovezlq 2009-07-11 22:17
    打赏 评论
  • liyistudio 2009-07-11 22:20

    主键关联

    一对一的主键关联形式,即两张关联表通过主键形成一对一映射关系。

    一个典型的主键关联实例:中国公民只允许拥有一份护照,这里我们把用户TUser和护照TPassport设定为基于主键关联的一对一关系:

    在Hibernate中,通过one-to-one节点对一对一关系进行声明:

    TUser.hbm.xml

       <class
    
              name=”com.redsaga.hibernate.db.entity.TUser”
    
              table=”T_USER”
    
       >
    
              <id name=”id” column=”id” type=”java.lang.Integer”>
    
              </id>
    
              <property name=”name” type=”java.lang.String” column=”name”/>
    
              <property name”age” type=”java.lang.Integer” column=”age”/>
    
              <one-to-one name=”passport”
    
                     class=”com.redsaga.hibernate.db.entity.TPassport”
    
                     cascade”all”
    
                     outer-join=”true”
    
              />
    
       </class>
    

    在上面的配置中:

    1.通过one-to-one节点,我们将TUser类与TPassport类相关联。大于one-to-one节点的具体配置请参见附录。

    2.级联关系设置为all。

    级联(cascade)在Hibernate映射关系中是个非常重要的概念。它指的是当主控方执行操作时,关联对象(被动方)是否同步执行同一操作。如对主控对象调用save-update或delete方法时,是否同时对关联对象(被动方)进行save-update或delete。

    TPassport.hbm.xml

       <class
    
              name=”com.redsaga.hibernate.db.entity.TPassport”
    
              table=”T_PASSPORT”
    
       >
    
       <id name=”id” column=”id”>
    
              <generator class=”foreign”>
    
                     <param name=”property”>user</param>
    
              </generator>
    
       </id>
    
    
    
       <one-to-one
    
              name=”user”
    
              class=”com.redsaga.hibernate.db.entity.TUser”
    
              constrained=”true”
    
       />
    
    
    
       ...
    

    由于采用了主键关联方式,那通过主键关联的两张表,其关联记录的主键值须保持同步。这也就意味着,我们只需为一张表设定主键生成器,而另一张表的主键与之共享相同的主键值。

    在hibernate中,我们可以通过“foreign”类型的主键生成器与外键共享主键值。

    同时,one-to-one节点的constrained属性必须设定为“true”,以告知Hibernate当前表主键止存在一个约束:“T_Passport表引用了T_User表的主键”。

    测试代码:

    TUser user=...

    ...

    passport.setUser(user);

    user.setPassport(passport);

    Transaction tx=sexxion.beginTransaction();

    session.save(user);

    tx.commit();

    惟一外键关联

    在一个假定的权限管理系统中,线个用户都从属于一个用户组。如用户“Erica”从属于“System Admin”组。用户表T_User中包含一个group_id字段,此字段与T_Group的id字段相关联。这就是一个典型的“惟一外键关联”:

    首先我们来看映射配置,如下:

       <class
    
              name=”com.redsaga.hibernate.db.entity.TUser”
    
              table=”T_USER”
    
       >
    
    
    
              <id name=”id” column=”id” type=”java.lang.Integer”>
    
                     <generator class=”native”/>
    
              </id>
    
    
    
              <property name=”name” type=”java.lang.String” column=”name”/>
    
              ...
    
    
    
              <many-to-one
    
                     name=”group”
    
                     class=”com.redsaga.hibernate.db.entity.TGroup”
    
                     column=”GROUP_ID”
    
                     unique=”true”
    
              />
    
       </class>
    

    打赏 评论
  • fdsafds 2009-07-11 23:32
    打赏 评论
  • xiayuanfeng 2009-07-21 13:50

    constrained="true" 创建表的时候你就会看见区别了。加了这个,就会给表加外键约束,前提是你的数据库引擎要支持外键约束。MySQL的MyISAM不支持。

    打赏 评论

相关推荐 更多相似问题