hibernate 一对多关联

简介:
1.映射文件
 
<?xml version= "1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC    
   "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
  "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping package="one2many"
  <class name="Tuser" table="t_user"
    <id name="id"
      <generator class="native"/> 
    </id> 
    <property name="name"/> 
    <set name="addresses" lazy="true"    cascade="all" > 
      <key column="user_id"    not-null="true"/> 
      <one-to-many class="Taddress" /> 
    </set> 
  </class
    
    
</hibernate-mapping>
 
<?xml version= "1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC    
   "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
  "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping package="one2many"
  <class name="Taddress" table="t_address"
    <id name="cid"
      <generator class="native"/> 
    </id> 
    <property name="tel" /> 
    <property name="zipcode"/> 
  </class
    
    
</hibernate-mapping>
 
测试代码:
   public  void testInsert(){ 
    Transaction tc =  null
     try{        
      tc = session.beginTransaction(); 
      Tuser user =  new Tuser(); 
      user.setName( "xiaozhao2"); 
        
      Set adds =  new HashSet(); 
      Taddress add1 =  new Taddress(); 
      add1.setTel( "123"); 
      add1.setZipcode( "897"); 
        
        
      Taddress add2 =  new Taddress(); 
      add2.setTel( "123"); 
      add2.setZipcode( "897"); 
        
      adds.add(add1); 
      adds.add(add2); 
      user.setAddresses(adds); 
        
      session.save(user); 
      tc.commit(); 
    } catch(HibernateException e){ 
      tc.rollback(); 
      e.printStackTrace(); 
    } 
     
  }
 
 
生成的sql
Hibernate: insert into t_user (name, id) values (?, ?)
Hibernate: insert into t_address (tel, zipcode, user_id, cid) values (?, ?, ?, ?)
Hibernate: insert into t_address (tel, zipcode, user_id, cid) values (?, ?, ?, ?)
Hibernate: update t_address set user_id=? where cid=?
Hibernate: update t_address set user_id=? where cid=?
 
注意:并没有报错,《深入浅出Hibernate》 说是会报错的,
<key column="user_id"  not-null="true"/>
将t_address 表的user_id 字段设置为非空了。
书上说 会报错的。我怎么没有报错呢
 
 
一对多双向关联
一的一方:
<?xml version= "1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC    
   "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
  "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping package="one2many"
  <class name="Tuser" table="t_user"
    <id name="id"
      <generator class="native"/> 
    </id> 
    <property name="name"/> 
    <set name="addresses" lazy="true"    cascade="all" inverse="true" > 
      <key column="user_id" /> 
      <one-to-many class="Taddress" /> 
    </set> 
  </class
    
    
</hibernate-mapping>
 
多的一方:
<?xml version= "1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC    
   "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
  "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping package="one2many"
  <class name="Taddress" table="t_address"
    <id name="cid"
      <generator class="native"/> 
    </id> 
    <property name="tel" /> 
    <property name="zipcode"/> 
     
    <many-to-one name="user" column="user_id"/> 
  </class
    
    
</hibernate-mapping>
 
 
测试代码:
public  void testInsert(){ 
    Transaction tc =  null
     try{        
      tc = session.beginTransaction(); 
      Tuser user =  new Tuser(); 
      user.setName( "xiaozhao2"); 
        
      Set adds =  new HashSet(); 
      Taddress add1 =  new Taddress(); 
      add1.setTel( "123"); 
      add1.setZipcode( "897"); 
        
        
      Taddress add2 =  new Taddress(); 
      add2.setTel( "123"); 
      add2.setZipcode( "897"); 
        
      adds.add(add1); 
      adds.add(add2); 
      user.setAddresses(adds); 
        
      session.save(user); 
      tc.commit(); 
    } catch(HibernateException e){ 
      tc.rollback(); 
      e.printStackTrace(); 
    } 
     
  }
 
 
发出sql:
 
Hibernate: insert into t_user (name, id) values (?, ?)
Hibernate: insert into t_address (tel, zipcode, user_id, cid) values (?, ?, ?, ?)
Hibernate: insert into t_address (tel, zipcode, user_id, cid) values (?, ?, ?, ?)
 
 1.如果我把<key column="user_id" /> 修改为<key column="user_id" not-null="true"/>
这时候会把错。 为什么 这时候才报错呢?
发出的sql 都一样。 个人认为:可能是inverse的用法
 



本文转自 randy_shandong 51CTO博客,原文链接:http://blog.51cto.com/dba10g/246180,如需转载请自行联系原作者
相关实践学习
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
相关文章
|
2月前
|
Java 数据库连接 API
解锁高效开发秘籍:深入探究 Hibernate 如何优雅处理一对多与多对多关系,让数据映射再无烦恼!
【9月更文挑战第3天】Hibernate 是 Java 领域中最流行的 ORM 框架之一,广泛用于处理实体对象与数据库表之间的映射。尤其在处理复杂关系如一对多和多对多时,Hibernate 提供了丰富的 API 和配置选项。本文通过具体代码示例,展示如何使用 `@OneToMany`、`@JoinColumn`、`@ManyToMany` 和 `@JoinTable` 等注解优雅地实现这些关系,帮助开发者保持代码简洁的同时确保数据一致性。
45 4
|
SQL XML Java
Hibernate框架【四】——基本映射——多对一和一对多映射
Hibernate框架【四】——基本映射——多对一和一对多映射
172 0
|
Java 数据库连接
hibernate一对多关系操作
hibernate一对多关系操作
167 1
hibernate一对多关系操作
|
XML Java 数据库连接
《Hibernate上课笔记》------class6------Hibernate实现一对多关联映射
《Hibernate上课笔记》------class6------Hibernate实现一对多关联映射
60 0
《Hibernate上课笔记》------class6------Hibernate实现一对多关联映射
|
XML Java 关系型数据库
hibernate里面的一对多关系映射
hibernate里面的一对多关系映射
111 0
|
存储 Java 数据库连接
【框架】[Hibernate]利用Hibernate进行一对多的级联操作-Web实例
【框架】[Hibernate]利用Hibernate进行一对多的级联操作-Web实例
180 0
【框架】[Hibernate]利用Hibernate进行一对多的级联操作-Web实例
|
Java 数据库连接 网络安全
【SSH快速进阶】——Hibernate 多对一映射 和 一对多映射
上两篇文章说了一对一映射,这里说一下多对一 和 一对多的映射情况。
【SSH快速进阶】——Hibernate 多对一映射 和 一对多映射
|
缓存 Java 数据库连接
Hibernate一对多关联的两个关键属性cascade和inverse(十一)
Hibernate一对多关联的两个关键属性cascade和inverse(十一)
121 0
Hibernate一对多关联的两个关键属性cascade和inverse(十一)
|
存储 Java 数据库连接
Hibernate的一对多映射的单向关联和双向关联(九)
Hibernate的一对多映射的单向关联和双向关联(九)
132 0
Hibernate的一对多映射的单向关联和双向关联(九)
|
缓存 NoSQL Java
hibernate(三) 一对多映射关系
前面两节讲了hibernate的两个配置文件和hello world!。还有hibernate的一级缓存和三种状态,基本上hibernate就懂一点了,从这章起开始一个很重要的知识点,hibernate的关系映射。一对一、一对多、多对多的讲解。,希望你们能从中学到东西,我也从中巩固自己的知识
155 0