`
tianyalinfeng
  • 浏览: 442412 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

hibernate 复合主键 多对多 级联保存

    博客分类:
  • Java
 
阅读更多

package com.patsnap.hibernate.beans;

import java.io.Serializable;
import java.util.List;

public class Patent implements Serializable{
 private String pn;
 
 private String apno;
 
 private List<LegalStatus> legalStatus;
 
 public List<LegalStatus> getLegalStatus() {
  return legalStatus;
 }
 public void setLegalStatus(List<LegalStatus> legalStatus) {
  this.legalStatus = legalStatus;
 }
 public String getPn() {
  return pn;
 }
 public void setPn(String pn) {
  this.pn = pn;
 }
 public String getApno() {
  return apno;
 }
 public void setApno(String apno) {
  this.apno = apno;
 }
}

 

package com.patsnap.hibernate.beans;

import java.util.List;

public class LegalStatus {
 private int id;
 
 private String apno;
 
 private List<Patent> patents;

 public List<Patent> getPatents() {
  return patents;
 }

 public void setPatents(List<Patent> patents) {
  this.patents = patents;
 }

 public int getId() {
  return id;
 }

 public void setId(int id) {
  this.id = id;
 }

 public String getApno() {
  return apno;
 }

 public void setApno(String apno) {
  this.apno = apno;
 }
}

 

<?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" >
<hibernate-mapping package="com.patsnap.hibernate.beans">
 <class name="Patent" table="Patent">
  <composite-id>
   <key-property name="pn" type="string" column="pn" />
   <key-property name="apno" type="string" column="apno" />
  </composite-id>

  <bag name="legalStatus" table="Patent_LegatStatus"
   inverse="false">
   <key>
    <column name="pn"></column>
    <column name="apno"></column>
   </key>
   <many-to-many class="LegalStatus" column="id" />
  </bag>
 </class>
</hibernate-mapping>  

 

<?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" >
<hibernate-mapping package="com.patsnap.hibernate.beans">
 <class name="LegalStatus" table="LegalStatus">
  <id name="id" column="id" type="int">
   <generator class="native" />
  </id>
  <property name="apno" column="apno" type="java.lang.String" />

  <bag name="patents" table="Patent_LegatStatus"
   inverse="false">
   <key>
    <column name="id"></column>
   </key>
   <many-to-many class="Patent">
    <column name="pn"></column>
    <column name="apno"></column>
   </many-to-many>
  </bag>
 </class>
</hibernate-mapping>  

 

 

注1:这里bag标签里没有设置cascade属性,这样在保存Patent或LegalStatus时仅级联保存中间表,不会删除中间表数据,但要求保存一方的时候,另一方的数据必须已经存在(因为仅级联保存中间表数据,不会保存另一方数据)

public static void insert() {
  Session session = HibernateSessionFactory.getSession();
  Transaction t = session.beginTransaction();

  LegalStatus legalStatus = new LegalStatus();
  legalStatus.setApno("12345");

  Patent patent = new Patent();
  patent.setPn("321141112");
  patent.setApno("3211112");//该patent在数据库必须已经存在,否则报错
  List<Patent> list = new ArrayList<Patent>();
  list.add(patent);
  legalStatus.setPatents(list);

  session.save(legalStatus);

  t.commit();

 }

注2:如果bag标签里cascade属性设置了相应值(如save-update等),则在保存一方数据的同时会保存同时保存中间表和另一方的数据(如果不存在的话),但是再保存两者关系的同时,会先把中间表数据删除一遍,再加上当前添加的关系,所以这时候要特别注意,要先把关系设置完整再做保存操作,否则会删除已有的关系

public static void insert(){
     Session session = HibernateSessionFactory.getSession();
     Transaction t = session.beginTransaction();
     
     
     LegalStatus legalStatus =new LegalStatus();
     legalStatus.setApno("12345");
     
     
     List<Patent> patentList = session.createQuery("from Patent where pn ='321141112' and apno='3211112'").list();
     Patent patent = new Patent();
     if (patentList.size()==1) {
      patent = patentList.get(0);
      patent.getLegalStatus().add(legalStatus);//保证原有的关系不变,不做这一步则丢失原有关系
  }else {
   patent.setPn("321141112");
   patent.setApno("3211112");
   List<Patent> list = new ArrayList<Patent>();
   list.add(patent);
   legalStatus.setPatents(list);
  }
         
     session.save(legalStatus);
     
     t.commit();
     
    }

注3:如果涉及到复合主键,该类需要implements Serializable

分享到:
评论

相关推荐

    Hibernate入门(代码+笔记)

    **第四部分:Hibernate复合主键** 复合主键在数据库设计中并不罕见,当一个表的主键由两个或更多字段组成时,就需要使用。在Hibernate中,可以使用@EmbeddedId和@IdClass注解来处理复合主键。@EmbeddedId将一个包含...

    Hibernate面试题专栏 - 最全的Hibernate面试题, Hibernate笔试题, Hibernate问题

    - **Session**: Hibernate的核心接口,用于与数据库交互,提供了保存、更新、删除和查询对象的方法。 - **SessionFactory**: 创建Session的工厂,通常在应用启动时创建并保持整个应用周期。 - **Transaction**: 事务...

    Hibernate开发指南01

    9. **高级特性**:涵盖实体的生命周期回调方法、复合主键、联合主键、级联操作、双向关联的处理、集合映射(List、Set、Map等)等进阶内容。 10. **案例实战**:通过一个完整的项目案例,演示如何在实际开发中整合...

    JPA实体关联(hibernate实现)

    以下将详细解释四种主要的关联类型:复合主键、多对多、一对一和一对多。 1. **复合主键(JPACompositePK)** 在某些情况下,一个实体的主键可能由多个字段组成,这就需要使用复合主键。在JPA中,我们可以创建一个...

    hibernate源码分析过程

    双向映射可以通过多对一、一对一、一对多关系来实现。 控件映射 Hibernate 的控件映射可以将一个对象的控件属性映射到数据库中。控件映射可以使用 Map 实现动态控件。 继承映射 Hibernate 的继承映射可以将一个...

    精通hibernate

    理解一对一、一对多、多对一、多对多关联映射是Hibernate进阶的关键。关联可以通过外键、主键引用、复合主键等方式实现。级联操作允许在父对象的操作中同时影响子对象。 七、缓存机制 Hibernate的缓存分为一级缓存...

    Hibernate3.6中文文档.rar

    此外,Hibernate还支持JPA(Java Persistence API)、实体继承、复合主键、查询结果转换为自定义类型等功能,极大地丰富了Java开发中的数据操作。 总之,“Hibernate3.6中文文档”提供了关于Hibernate 3.6的全面...

    hibernate结构框架及组要实现类的深入分析

    例如,你可以通过 `&lt;one-to-many&gt;` 或 `&lt;many-to-one&gt;` 标签定义一对多或多对一的关系,通过 `&lt;property&gt;` 标签映射类的属性到数据库的列。 **延迟加载(Lazy Loading)** 延迟加载是一种优化策略,允许对象的部分...

    hibernate v3.04中文参考手册

    10. **多对一、一对多、多对多关联映射** - 外键映射、集合映射,如List、Set、Map等。 - 使用@ManyToOne、@OneToOne、@OneToMany、@ManyToMany等注解实现。 11. **复合主键与自定义主键生成策略** - 组合主键的...

    hibernate快速学习指南

    3. 联合主键:对于复合主键,Hibernate提供了复合主键的处理方式。 4. 多对多关联:通过中间表实现两个实体之间的多对多关联。 九、最佳实践 1. 合理设计实体关系,避免深度嵌套的关联查询。 2. 使用预编译的SQL...

    Hibernate3.1参考手册中文版

    10. **多对一、一对多、多对多关系映射**:Hibernate支持多种关联关系,如单向和双向的一对多、多对一,以及多对多关系的配置。 11. **继承映射**:Hibernate支持类的继承关系映射,包括单表、表-per-hierarchy和表...

    hibernate注解详解

    当主键由多个字段组成时,可以使用`@EmbeddedId`和`@Embeddable`注解来定义复合主键。 10. **索引注解(@Index)** `@Index`注解用于在数据库表的列上创建索引,提高查询效率。 11. **缓存注解(@Cacheable, @Cache...

    最全的Hibernate Annotation API文档

    如果需要复合主键,可以使用`@IdClass`或`@EmbeddedId`。 四、字段映射(Columns) 字段与数据库列的映射通过`@Column`注解实现,如指定列名、长度、是否可为空等: ```java @Entity public class User { @Id ...

    Hibernate中文参考手册

    除了基础功能,Hibernate还支持多态性、继承映射、复合主键、延迟加载、双向一对多、多对多关系等复杂场景。此外,它也与其他技术如Spring Framework、MyBatis等有良好的整合性。 总的来说,《Hibernate中文参考...

    Hibernate高级特性

    当需要多个字段共同构成主键时,Hibernate的复合主键或联合主键功能就显得尤为重要,它允许我们将多个属性组合成一个主键。 9. **实体生命周期事件监听器** Hibernate允许注册监听器来响应实体的生命周期事件,如...

    hibernate一对一的例子

    - 一对一关系通常要求一方为主键,另一方为外键,但也可以设计成两者都是主键,这被称为复合主键。 - 需要确保数据库表结构与实体类的映射一致,包括外键约束等。 通过以上步骤,我们可以成功地在Hibernate中建立...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     15.3.4 把多对多关联分解为两个一对多关联  15.4 小结  15.5 思考题 第16章 Hibernate的检索策略  16.1 Hibernate的检索策略简介  16.2 类级别的检索策略  16.2.1 立即检索  16.2.2 延迟检索  16.3 一对多...

    Hibernate开发指南.pdf

    9. **关联映射**:覆盖一对一、一对多、多对一、多对多的各种关联映射方式,以及级联操作和反向映射。 10. **缓存机制**:介绍Hibernate的两级缓存(一级缓存Session,二级缓存如EHCache或Infinispan),以及缓存...

    hibernate中文参考文档

    3. **多对一(One-to-Many)、一对多(Many-to-One)、多对多(Many-to-Many)关系映射**: Hibernate 提供了丰富的注解和XML配置来处理各种关联关系。 4. **级联操作(Cascading)**: 通过级联属性,可以实现对关联...

    精通hibernate:对象持久化技术孙卫琴第二版part2

    7.1 建立多对一的单向关联关系 148 7.1.1 [many-to-one]元素的not-null属性 153 7.1.2 级联保存和更新 155 7.2 映射一对多双向关联关系 156 7.2.1 [set]元素的inverse属性 161 7.2.2 级联删除 163 7.2.3 父子...

Global site tag (gtag.js) - Google Analytics