`

024_ID生成策略_联合主键_XML

 
阅读更多

 

6.联合组件 (对于串知识点很重要)

a) xml:

   i:为什么要重写equals和hashcode

   ii:为什么要实现serializable

b)@IdClass

 

 

在面向对象中

 两个值为主键

就要分成两个类,一个类转为主键类,一个为正常的类。

 

 

步骤

1、进行写student类

2.、写studentpk类

3.配置Student.hbm.xml

4.进行写测试类HibernateIDTest.java

 

疑问:

1.在主键类中为什么要实现public class StudentPK implements java.io.Serializable{}

 

为什么要用序列化:

    作为student中,存在多条数据,多个student对象,

每个对象都有一个studentPK对象,

1.需要系统集群的服务,想传给另一台服务器,发现不实现序列化传不出去了。

2.内存满了,需要在硬盘上开辟一块虚拟内存,就要用序列化来实现,才能进行传递。

 

 

实现

在数据库中用主键来进行区分数据的;

内存里也应该用这样一种逻辑来区分,不然就不能数据库中的内容同步,不匹配了。

 

所有重写equals()和hashcode()

 

用联合主键就应该用equals()和hashcode()方法。

 

从数据库的角度讲,主键相同才返回true。

从内存的角度讲,我的id 和nanme和你相同才返回true。

 

 

我为什么重写hashcode()

装在hash表中,查hash表中的时候,要先查hashcode。

 

在找一个值时,进行找hashcode(找到后的一个链表进行遍历)

 

 

 

首先找studentPK的hashcode,然后再找到这个链表,再比较那个对象和我们这个对象equals。

 

 

 

 

代码案例:

 

StudentPK

 

package com.zhuhw.hibernate.model;

public class StudentPK implements java.io.Serializable{
@Override
public boolean equals(Object o) {
if(o instanceof StudentPK) {
StudentPK spk = (StudentPK)o;
if(this.id == spk.getId()&& this.name == spk.getName()){
return true;
}
}return false;
}
@Override
public int hashCode() {
// TODO Auto-generated method stub
return this.name.hashCode();
}
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private String name;
}

 

 

 

package com.zhuhw.hibernate.model;

import javax.persistence.Id;

public class Student {
StudentPK spk;
@Id
public StudentPK getSpk() {
return spk;
}
public void setSpk(StudentPK spk) {
this.spk = spk;
}
   private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
/*	private String name;*/
}

 

 

 

 

 

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 找不到entity,是因为这个类没改包名 -->
<hibernate-mapping package="com.zhuhw.hibernate.model">
<class name="Student">
<!-- id主键;name=id对应的是Student中的getid() -->
<!--<id name="id"  >
<generator class="uuid"></generator>
<generator class="native"></generator>
</id>
-->
<!-- 联合组件配置 -->
<composite-id name = "spk" class="com.zhuhw.hibernate.model.StudentPK">
<key-property name="id"></key-property>
<key-property name="name"></key-property>
</composite-id>
<property name="age" />
<!-- hibernater知道了怎么将class与表中的字段对应到一起了 -->
</class>
</hibernate-mapping>

 

 

 

 

package com.zhuhw.hibernate.model;

import java.util.Date;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

public class HibernateIDTest {
public static SessionFactory sf = null;
@BeforeClass
public  static void beforeClass(){
sf = new AnnotationConfiguration().configure().buildSessionFactory();
}
@Test
public void TestStudentID(){
Student s = new Student();
/*配置文件中使用generator
* s.setId(9);
* */
StudentPK spk = new StudentPK();
spk.setId(11);
spk.setName("waxun");
s.setAge(8);
s.setSpk(spk);
Session session = sf.openSession();
session.beginTransaction();
session.save(s);
session.getTransaction().commit();
session.close();
}
@Test
public void TestTeacherID(){
Teacher t = new Teacher();
t.setName("yuzhou1");
t.setTitle("ccc");
t.setBirthdate(new Date());
t.setYourWifeName("yourWifeName1");
t.setZhicheng(ZhiCheng.A);
//因为使用的annotation,所以Configuration要使用AnnotationConfiguration
/*Configuration cf = new AnnotationConfiguration();
SessionFactory sf = cf.configure().buildSessionFactory();*/
Session session = sf.openSession();
//在hibernate中执行操作要在一个事务里面
session.beginTransaction();
session.save(t);
session.getTransaction().commit();
session.close();
}
@AfterClass
public static void afterClass(){
sf.close();
}
}

 

 

 

 

运行结果:

com.zhuhw.hibernate.model.Student{spk=component[id,name]{id=11, name=waxun}, age=8}

 

 

 

 

分享到:
评论

相关推荐

    Hibernate联合主键的例子

    - 在使用联合主键时,通常不需要生成自增的ID,因为主键是通过组合多个字段生成的。 - 联合主键的每个字段通常都会设置为`@Column(nullable = false)`,确保它们在数据库中都是非空的。 通过以上步骤,你就可以在...

    mybatis反向工程.根据数据库表生成wrapper xml文件和类

    在实际开发中,主键的生成策略多种多样,包括自增(AUTO)、联合主键等。例如,`@Id`注解可以配合`GeneratedValue`注解来定义主键的生成策略。当使用自增主键时,通常在数据库层面设置,MyBatis或MyBatis-Plus会自动...

    mycat 主键自增代码

    Mycat 支持多种主键生成策略,包括:UNIONID(联合ID)、SEQUENCE(序列号)、TABLE(表序列)、UUID 和 AUTO_INCREMENT(自增)。其中,AUTO_INCREMENT 策略是与 MySQL 自增主键类似的方式,适用于单表插入操作。...

    ssh多主键插入

    多主键,也称为复合主键或联合主键,指的是在一个数据表中使用两个或更多的字段共同作为唯一标识符,确保每条记录的唯一性。这种设计常见于关系型数据库中,当单一字段不足以唯一标识一条记录时采用。例如,在一个...

    Hibernate笔记 马士兵

    第1课 课程内容 6 第2课 Hibernate UML图 6 第3课 风格 7 第4课 资源 7 第5课 环境准备 7 ...三、 联合主键 24 1、xml方式 24 2、annotation方式 27 第14课 Hibernate核心开发接口(重点) 29 ........

    hibernate学习笔记

    1. 使用`@IdClass`或XML中的`composite-id`定义联合主键。 2. 联合主键需要重写equals和hashCode方法,实现Serializable接口。 七、Hibernate核心接口 1. `Configuration`接口: - 提供了管理配置信息的方法,用于...

    estore系统设计文档.pdf

    - 订单项表(orderitem):用于存储订单与商品的多对多关系,包含order_id、product_id和buynum字段,order_id和product_id作为联合主键。 五、数据库环境与工程搭建 1. 创建名为"estoresystem"的数据库,并导入...

    hibernate_annotations

    Hibernate提供了多种主键生成策略,如`GenerationType.AUTO`、`GenerationType.IDENTITY`等,通过`@GeneratedValue`注解来指定: ```java @Entity public class User { @Id @GeneratedValue(strategy = ...

    MyBatis的关联映射-资料.rar

    5. **联合主键**:在处理具有联合主键的关联映射时,可以使用`&lt;id&gt;`标签内的多个`column`属性来定义。 6. **级联操作**:通过在`&lt;association&gt;`或`&lt;collection&gt;`标签中设置`cascade`属性,可以实现插入、更新和删除...

    hibernate_annotation

    这里,@GeneratedValue用于指定主键生成策略,IDENTITY表示自动增长。 2.2 Column注解:用于指定字段映射到数据库的列名和类型,如: ```java @Column(name = "username", nullable = false) private String ...

    springmybatis

    请注意,这里面有一个方法名 selectUserByID 必须与 User.xml 里面配置的 select 的id 对应(&lt;select id="selectUserByID") 重写测试代码 程序代码 程序代码 public static void main(String[] args) { ...

    java框架之hibernate

    #### 四、联合主键 在Hibernate中,可以使用复合主键来表示具有多个字段作为主键的实体。以下是一种定义复合主键的方法: ```xml &lt;composite-id&gt; &lt;key-property name="stuName"&gt;&lt;/key-property&gt; ...

    MyBatis Generator 生成器把其他数据库的同名表生成下来的问题:[WARNING] Table Configuration product matched more than one t

    MyBatis Generator(MBG)是一款强大的工具,用于自动生成MyBatis的Mapper接口、XML映射文件以及实体类,从而极大地提高了开发效率。然而,在使用MBG时,可能会遇到一些问题,比如“Table Configuration product ...

    马士兵hibernate学习笔记

    - **联合主键**:当实体类拥有多个主键时,需要特别配置联合主键策略。 #### 六、Hibernate 核心开发接口 - **项目**: `hibernate_0500_CoreAPI` - **API 文档**:建议查阅官方文档获取最新信息。 - **接口介绍**:...

    hibernate-mapping

    `id`元素定义了实体的主键,`generator`子元素则定义了主键的生成策略。在示例中,`increment`策略表示主键值会在每次插入新记录时自动递增。 4. 关联映射 Hibernate支持一对一、一对多、多对一、多对多四种关联...

    Hibernate annotations大全

    这里,`@Entity`标识`User`类为实体,`@Table`指定了对应的数据库表,`@Id`和`@GeneratedValue`定义了主键的生成策略。 4. 关联关系注解 当处理实体之间的关联时,我们需要使用关联注解。例如,`User`与`Role`的...

Global site tag (gtag.js) - Google Analytics