`
jackroomage
  • 浏览: 1217649 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

一对一主键双向关联(用代码控制级联删除)

阅读更多

一、下面的代码可以运行。

1、数据库脚本

--oracle数据库
-- 删除表
DROP TABLE idcard ;
DROP TABLE person ;

-- 创建表
CREATE TABLE person
(
 id VARCHAR2(32) PRIMARY KEY ,
 name VARCHAR2(20) NOT NULL ,
 age NUMBER
) ;
CREATE TABLE idcard
(
 id VARCHAR2(32),
 serial VARCHAR2(18) NOT NULL ,
 expiry NUMBER
) ;

//2############################################

// pojo类

//类一,IdCard

package org.onetoone.com;

public class IdCard {
 private String id;//卡号
 private String serial;//卡的号码(共18位)
 private int expiry;//可以使用年限
 
 private Person person;

 public String getId() {
  return id;
 }
 public void setId(String id) {
  this.id = id;
 }
 public String getSerial() {
  return serial;
 }
 public void setSerial(String serial) {
  this.serial = serial;
 }
 public int getExpiry() {
  return expiry;
 }
 public void setExpiry(int expiry) {
  this.expiry = expiry;
 }
 public Person getPerson() {
  return person;
 }
 public void setPerson(Person person) {
  this.person = person;
 }

}

// pojo类

//类二,Person

package org.onetoone.com;

public class Person {
 private String id ;//perosn的id
 private String name;//名字
 private int  age;   //年龄
 
    private IdCard idcard;
   
 public String getId() {
  return id;
 }
 public void setId(String id) {
  this.id = id;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public int getAge() {
  return age;
 }
 public void setAge(int age) {
  this.age = age;
 }
 public IdCard getIdcard() {
  return idcard;
 }
 public void setIdcard(IdCard idcard) {
  this.idcard = idcard;
 }
}

2、配置文件。

IdCard.hbm.xml

 

<hibernate-mapping>
 <class name="org.onetoone.com.IdCard" table="idcard">
 <!-- 引用Person的主键作为idCard的主键和外键 -->
  <id name="id" column="id" type="java.lang.String">
   <generator class="foreign">
    <param name="property">person</param>
   </generator>
  </id>
  
     <!-- constrained="true",表示idcard引用了Person主键作外键 -->
  <one-to-one name="person"
   class="org.onetoone.com.Person" 
   constrained="true">
  </one-to-one>


  <property name="serial" type="java.lang.String">
   <column name="serial" length="18" not-null="true" />
  </property>
  <property name="expiry" type="java.lang.Integer">
   <column name="expiry" not-null="true" />
  </property>
 </class>
</hibernate-mapping>

 

 

Person.hbm.xml

 

<hibernate-mapping>
 <class name="org.onetoone.com.Person" table="person">
  <id name="id" type="java.lang.String">
   <column name="id" length="32" />
   <generator class="uuid.hex"></generator>
  </id>
  <property name="name" type="java.lang.String">
   <column name="name" length="20" not-null="true" />
  </property>
  <property name="age" type="java.lang.Integer">
   <column name="age" />
  </property>
  <!-- 下面中的cascade="all",级联保存,删除,修改时 person对象关联的idcard对象。-->
  <!-- Hibernate outer-join参数允许下列三个不同值:
            auto:(默认) 使用外连接抓取关联(对象),如果被关联的对象没有代理(proxy)
            true:一直使用外连接来抓取关联
            false:永远不使用外连接来抓取关联 
         -->
  <one-to-one name="idcard"
   class="org.onetoone.com.IdCard"
   cascade="all"
   outer-join="true"
    >
  </one-to-one>
 </class>
</hibernate-mapping>

3、测试类。PersonIdCardOperation

 

public class PersonIdCardOperation {
 private Session session = null;

 public PersonIdCardOperation() {
  this.session = new Configuration().configure().buildSessionFactory()
    .openSession();
 }

 // 先插入一个用户
 public void insert(Person per) {
  this.session.save(per);
  this.session.beginTransaction().commit();
  session.close();
 }
 //这个查询是用来更新或删除用的
 public Person queryById(String id) {
  Person per = null;
  String hql = "FROM Person AS p where p.id=?";
  Query q = this.session.createQuery(hql);
  q.setString(0, id);
  List all = q.list();
  if (all.size() > 0) {
   per = (Person)all.get(0);
  }
  return per;
 }
   //更新person
 public void update(Person per) {
  this.session.update(per);
  this.session.beginTransaction().commit();
 }

 
 //删除一个person
 public void delete(Person per)
 {  
  this.session.delete(per);
  this.session.beginTransaction().commit() ;
 }

 

 // 一个专门用于更新身份证的操作
 public void update(IdCard ic)
 {
  this.session.update(ic) ;
  this.session.beginTransaction().commit() ;
 }
 
 // 一个专门用于删除身份证的操作
 public void delete(IdCard ic)
 {
  this.session.delete(ic) ;
  this.session.beginTransaction().commit() ;
 }


 /**
  * @param args
  */
 public static void main(String[] args) {
  PersonIdCardOperation po = new PersonIdCardOperation();
//增加  person和idcard  
      /*  Person per =new Person();
  per.setName("jack");
  per.setAge(19851105);

  IdCard ic = new IdCard();
  ic.setSerial("ttttttt");
  ic.setExpiry(44);
  
  per.setIdcard(ic);
  ic.setPerson(per);

  po.insert(per) ;*/                                                                      
//***************************************************
//修改 person与idcard  
      /*  Person uper =po.queryById("ff808081289edac801289edac90e0001");
   
   uper.setName("jack");
   uper.setAge(25);

   IdCard uic = uper.getIdcard();
   uic.setSerial("YYYYYY");
   uic.setExpiry(8);
   
   uper.setIdcard(uic);
   uic.setPerson(uper); 
 
//update它会根据你的信息有没有变化而去更新你的信息,它自己会判断一下的。
      po.update(uper);  */                
  
//***************************************************
//删除  person 与idcard  
       /*   Person dper =po.queryById("ff808081289ed0a101289ed0a22e0001");

    IdCard dic = dper.getIdcard();

    dper.setIdcard(dic);
    dic.setPerson(dper); 
    
              po.delete(dper); */                  
 }

}

 

 

4、总结:这个  一对一主键双向关联(用代码控制级联删除)的 和 在数据库控制级联删除 还是有点不同的。

 

分享到:
评论

相关推荐

    Hibernate ORM - 一对一主键关联关系

    综上所述,Hibernate ORM 的一对一主键关联关系是通过共享主键或外键约束来实现两个实体间的唯一对应。在实际应用中,开发者需要根据需求选择合适的关联方式,并注意关联带来的性能影响。通过理解并熟练掌握这些配置...

    hibernate一对一关联关系

    以上就是关于Hibernate一对一关联关系的详细解释,通过理解和掌握这些知识点,你可以更有效地在Java项目中设计和实现数据库模型,提高代码的可读性和维护性。希望这份资源能帮助你更好地理解和运用Hibernate框架。

    Hibernate双向一对一关联映射(XML版)

    - 在一对一双向关联中,如果两个实体都维护外键,可能会导致数据不一致,因此要谨慎处理。 总结起来,Hibernate双向一对一关联映射通过XML配置文件使得我们在Java代码中可以方便地操作数据库中的一对一关系,同时...

    Hibernate 一对一关联查询.docx

    本文将深入探讨基于外键的一对一关联查询,并通过具体的代码示例进行解析。 ### 1. 基于外键的一对一关联 在一对一关联中,外键方式是指在一个实体类中引用另一个实体类的主键作为外键。这种方式下,关联关系的...

    Hibernate教程14_关系映射之多对多双向关联

    6. **级联操作**:我们还可以通过设置`cascade`属性来控制级联操作,比如删除一个`Student`时,是否应同时删除其关联的所有`Course`。 7. **缓存策略**:考虑使用缓存提高性能,比如二级缓存,但要注意多对多关系...

    学习hibernate第二天

    2. **配置另一方实体**:在另一方实体的类中,同样定义一个双向关联的属性,这次不需要`mappedBy`,而是使用`@OneToOne`注解的`cascade`属性来控制级联操作。 ```java @Entity public class UserProfile { @Id @...

    Hibernate 的关联映射

    "Hibernate的关联映射"是Hibernate中的核心概念之一,用于模拟数据库中的关系,包括一对一(One-to-One)、一对多(One-to-Many)、多对一(Many-to-One)和多对多(Many-to-Many)四种关系。现在,让我们详细探讨...

    Hibernate关联关系总结

    关联可以是单向或双向的,单向关联只需在拥有主键的一方添加注解,而双向关联则需要在双方都添加注解,并通过`mappedBy`属性指定关联的另一方。此外,为了确保唯一性,通常会设置外键约束。 **一对多关联(One-to-...

    23-Hibernate数据关联(11、M1、1N、MN)

    本教程将深入探讨Hibernate中的四种主要数据关联:一对一(11)、多对一(M1)、一对多(1N)和多对多(MN)的关系映射。 1. **一对一(11)关联**: 在现实世界中,有些实体间存在一对一的关系,例如一个人只有一...

    Hibernate数据关联技术笔记

    1:1(一对一)关联表示两个实体之间存在一对一的关系,例如一个人对应一张唯一的身份证。在Hibernate中,可以通过`&lt;one-to-one&gt;`标签实现。如示例所示,`Person`类和`IDCard`类之间的关联就是这样设置的。在`Person....

    hibernate常用配置

    - 使用 `&lt;one-to-one&gt;` 元素来实现一对一关联,`&lt;generator class="foreign"&gt;` 指定主键生成器为 foreign,确保与 `idCard` 共享相同的对象标识符(OID)。`constrained="true"` 添加了外键约束,保证 `Citizen` 的...

    hibernate一对一关系详解

    在一对一关系中,通常使用`@JoinColumn`创建外键关联。 4. **级联操作** 使用`cascade`属性可以控制关联对象的生命周期。例如,`cascade="all"`会将所有操作(包括保存、更新、删除)都应用于关联的对象。 5. **...

    使用jpa映射关联和继承

    1. **一对一(OneToOne)映射**:一个实体对象对应数据库中的一个记录。通过`@OneToOne`注解来实现,可以是单向或双向。`@JoinColumn`用于指定外键所在的字段,`@MapsId`则表明关联对象的主键就是当前对象的主键。 ...

    Hibernate映射解析 七种映射关系 后端 - Java.zip

    5. **双向关联**:在一对一和一对多关系中,通常会定义双向关联,即双方都能访问对方。这需要在两个类中都添加相应的注解,并通过`inversedBy`属性进行关联。 6. **级联操作(Cascading)**:级联操作允许将操作...

    hibernate关联关系

    这篇教程将深入探讨Hibernate的关联关系,包括1对1、一对多和多对多等类型,并通过简单的代码示例帮助初学者理解和应用。 1. **1对1关联关系** 在数据库设计中,1对1关联意味着一个表的记录最多对应另一个表的一条...

    ORM映射关系配置

    - `cascade`属性:控制级联操作,如`CascadeType.ALL`表示所有操作都级联到关联对象。 - `unique`属性:对于一对一关系,如果要求关联对象唯一,可设置为`true`。 5. **性能优化** - 避免过多的EAGER加载,以免...

    Hibernate_Annotation参考文档

    - 使用`@OneToOne`注解进行一对一映射配置。 - **多对一映射**: - 使用`@ManyToOne`注解进行多对一映射配置。 - **一对多映射**: - 使用`@OneToMany`注解进行一对多映射配置。 - **多对多映射**: - 使用`@...

    Hibernate教程_note.pdf

    例如,标签用于描述多对一的关联映射,而则用于描述一对一的主键关联映射。文档中还提到了级联属性(-cascade),它定义了在对父对象进行操作时,是否将操作也作用到关联的子对象上。 文档通过对象模型和关系模型的...

    hibernate 帮助文档

    - **一对一**:定义一对一的关联关系。 - **自然ID(natural-id)**:定义自然主键。 - **组件(component)和动态组件(dynamic-component)**:定义组件类型的映射。 - **属性(Properties)**:定义属性集合的...

    hibernate3.6 文档(pdf 格式)

    - **双向关联与连接表**:说明如何使用连接表来实现双向关联。 #### 九、组件映射 - **依赖对象**:解释如何映射没有独立生命周期的组件对象。 - **依赖对象集合**:展示如何映射依赖对象的集合。 - **Map 索引组件...

Global site tag (gtag.js) - Google Analytics