`
terry_yip
  • 浏览: 38769 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

one-to-one关系中的插入问题

阅读更多
CREATE TABLE `member` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(11) default NULL,
  PRIMARY KEY  (`id`)
) 


CREATE TABLE `contact` (
  `id` int(11) NOT NULL auto_increment,
  `memberId` int(11) default NULL,
  `mobile` varchar(30) default NULL,
  PRIMARY KEY  (`id`)
)


member表与contact表是一对一关联的,member.id和contact.memberId相对应。

<class name="table.member.Member" table="member">
     
     <id name="id" type="long" unsaved-value="0">
       <column name="id" not-null="true"/>
       <generator class="native"/>
     </id>
     
     <property name="name"/>
     <one-to-one name="contact" class="table.member.Contact" cascade="all"/> 
    
</class>


<class name="table.member.Contact" table="contact">
   
   <id name="id" type="long" unsaved-value="0">
       <column name="id" not-null="true"/>
       <generator class="native"/>
   </id>
 
     <property name="mobile" type="string" column="mobile" />
     <one-to-one name="member" class="table.member.Member" cascade="all"/>
     
  </class>


  public class Member
  {
    private long id;
    private String name;
    Contact contact;

    。。。。。
    getter,setter()

  }


  public class Contact
 {
     private long id;
     private long memberId;
     String mobile;
     Member member;

     。。。。。。。
     getter,setter

  }


测试

public static void main(String[] args)
{
		DAO dao=new DAO();
		Member m=new Member();
		Contact c=new Contact();
		

		c.setMobile("84250795");	
		m.setContact(c);
		m.setName("Mother");
	
	         dao.insert(m);
}



  当我想在session.save(member)的时候,在contact中也插入一行新数据,但是member的id是native的,由数据库产生,有什么办法令到这个新的id的值,被hibnernate得到,并插入到contact的memberId当中呢?

    我搜索了一下本版的贴子,以前也有人问过同样的问题,有人回答说one-to-one关系,必要session.save两次,我很想大家论讨一下是不是一定要这样做。我想如果是这样的话,那么one-to-one就没多大意义了,我不如直接在表中写个外键约束算了。

欢迎大家发表意风。
 
分享到:
评论
3 楼 xly_971223 2007-05-08  
楼主的一对一写法好像不对吧
应该把contact.memberId定义为member.id的外键 同时又是contact表的主键。去掉contact.id
《深入浅出hibernate》里有这样的例子
2 楼 spiritfrog 2007-05-08  
感觉lz这样实现一对一映射是不正确的lz的。如果是用一对一的外键关联,实际可以采用many-to-one的映射,Member为多方,其中包含一个外键contactid引用Contact:

<class name="table.member.Member" table="member"> 
 
     <id name="id" type="long" unsaved-value="0">  
       <column name="id" not-null="true"/>  
       <generator class="native"/>  
     </id>  
       
     <property name="name"/>  

     <many-to-one 
        name="contact" 
        column="contactid"
        unique="true"
        not-null="true"/>    
       
</class>  
  
<class name="table.member.Contact" table="contact">  
      
   <id name="id" type="long" unsaved-value="0">  
       <column name="id" not-null="true"/>  
       <generator class="native"/>  
   </id>  
    
   <property name="mobile" type="string" column="mobile" />  
            
</class>  
1 楼 janh 2007-05-07  
如果你的contact是从对象,那么应该在contact映射文件中设置依赖约束于member对象,插入时不用你关心id的设置,hibernate的级联插入会自动管理。

个人觉得hibernate中的一对一关联并不好用,会有从对象的不能延迟加载,形成n+1次查询,或者必须在查询中指定join fetch,当然这是一对一的机制造成的,确实不好处理。
所以建议改成memeber与contact的多对一关系,contact为一方,这样通过member对象本身的数据就可以知道contact对象是否存在,而member为主contact为从的一对一方式是办不到的,必须要进行数据库查询,这也是从方不能被延迟加载的原因。这样可以由member对象很方便的关联获取到contact信息,延迟加载等都没问题。

相关推荐

    ComponentOne Doc-To-Help—用于生成各种完美文档的专业控

    ComponentOne Doc-To-Help 6.5独有的项目架构存储了类型、主题、索引关键词和项目数据库中内容条目表之间的所有关系。可自动生成索引条目、超级链接标签、转向和弹出等功能。 项目编辑器 在单一的界面中,便可进行...

    Hibernate-one-to-many

    本文将深入探讨Hibernate中一对多(One-to-Many)关系的处理方式,特别是通过外键映射和inverse属性的应用场景。 #### 一对多关系概念 一对多关系在数据库设计中非常常见,它指的是一个实体可以与多个其他实体关联...

    Laravel开发-belongs-to-one

    在Laravel框架中,"belongs-to-one"关系是Eloquent ORM(对象关系映射)中的一个基本概念。它表示一种一对一的关联,其中一个模型属于另一个模型。这种关系在数据库设计中非常常见,例如用户和其个人资料,或者汽车...

    NHibernate中对象关系类型

    1.1 单向一对一(One-to-One)关系 在这种关系中,一个类的实例对应数据库表中的一行。例如,一个用户类(User)可能有一个唯一的身份证明类(Identity),两者之间是一对一关系。在NHibernate中,这可以通过使用`&lt;one-...

    Hibernate性能调优

    - **定义**:`one-to-one`关联表示两个实体之间的一对一关系。 - **示例**:用户与其个人资料之间的关联。 - **注意点**: - `one-to-one`关联通常通过主键进行连接。 - 在某些情况下,将一个大的数据表拆分成多个...

    one-to-one-chat

    由于文件列表只给出了`one-to-one-chat-main`,这可能是项目根目录的名称,具体的代码结构和实现细节需要进一步查看源代码才能分析。通常,一个这样的项目会包含以下部分: - `views`:存放EJS模板文件的地方。 - `...

    hibernate中基于主键的one2one

    在Java的持久化框架Hibernate中,一对一(One-to-One)关联是对象关系映射(ORM)中的一个重要概念,它表示两个实体类之间的一种一对一的关系。在这种关系中,一个实体类的实例对应另一个实体类的唯一实例。在...

    hibernate5--3.映射关系

    本文将深入探讨Hibernate5中的映射关系,主要包括多对多(Many-to-Many)和一对多(One-to-Many)这两种关系。 一、多对多映射(Many-to-Many) 多对多关系在数据库中表现为两个表之间存在多个连接记录,而在对象...

    One way to retain the value from orevious row

    在数据处理过程中,有时我们需要保留来自前一行的值并在当前行中使用。Informatica作为一个强大的ETL(提取、转换、加载)工具,提供了多种方法来实现这种“保留前一行值”的功能。本示例将详细解释如何在...

    hibernate对象三状态及OneToOne&OneToMany&ManyToMany

    在Java世界中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据。本篇将详细阐述Hibernate中的对象三状态、一对一(OneToOne)、一对多...

    Hibernate一对多(多对一)双向关联(annotation/xml)

    在Java的持久化框架Hibernate中,一对多(Many-to-One)和多对一(One-to-Many)的关系映射是数据库关系模型中的常见关联类型。本文将深入探讨这两种关联方式在使用Hibernate时的配置,包括基于注解(Annotation)和...

    hibernate(一对多,多对一映射)操作

    这种关系在数据库中可以表现为一对多(One-to-Many)或多对一(Many-to-One)的关系。 1. 一对多映射(One-to-Many): 在这种关系中,一个实体(父实体)可以与多个其他实体(子实体)相关联。在Hibernate中,...

    算法参考资料Introduction-to-algorithms-3rd-edition

    《Introduction to Algorithms, Third Edition》这本书对于理解和应用计算机算法领域中的基本概念和技术是极其有帮助的,适合于计算机科学与工程、软件开发和其他相关领域的学习者。它不仅覆盖了算法理论,还包含了...

    算法参考资料From-Baylor-to-Baylor

    3. 排序算法:常见的排序算法,例如冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等可能在参考资料中有所涉及。 4. 搜索算法:包括线性搜索、二分搜索以及在特定数据结构上的搜索技术,如图搜索算法...

    第1章(绪论)-练习题.docx

    * 一对一关系(One-to-One):每个数据元素对应一个数据项。 * 一对多关系(One-to-Many):每个数据元素对应多个数据项。 * 多对一关系(Many-to-One):多个数据元素对应一个数据项。 * 多对多关系(Many-to-...

    edjpgcom|图片中插入一句话

    edjpgcom is a free Windows application that allows you to change (or add) a JPEG commment in a JPEG file. That's all it does. All other fields in a JFIF or Exif file ...可以在正常的图片中插入一句话代码。

    1-15-Table-Tree table-TreeByKeyTableColumn - One level.pdf

    - **插入数据到表格**:将`ls_flights`插入到`lt_flights`表中,完成数据初始化。 - **绑定数据**:最后,通过`bind_table`方法将`lt_flights`数据绑定到`lo_nd_flights`节点上。 #### 四、代码示例 以下是一些...

    MySQL8.0学习第二章

    - 一对一(One-to-One):一个表中的记录只对应另一个表中的一个记录,如员工和员工详细信息的关系。 4. 多表查询: - 笛卡尔积:不加任何连接条件时,两个表的交叉连接会产生所有可能的组合。 - 内连接(INNER ...

Global site tag (gtag.js) - Google Analytics