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}
相关推荐
- 在使用联合主键时,通常不需要生成自增的ID,因为主键是通过组合多个字段生成的。 - 联合主键的每个字段通常都会设置为`@Column(nullable = false)`,确保它们在数据库中都是非空的。 通过以上步骤,你就可以在...
在实际开发中,主键的生成策略多种多样,包括自增(AUTO)、联合主键等。例如,`@Id`注解可以配合`GeneratedValue`注解来定义主键的生成策略。当使用自增主键时,通常在数据库层面设置,MyBatis或MyBatis-Plus会自动...
Mycat 支持多种主键生成策略,包括:UNIONID(联合ID)、SEQUENCE(序列号)、TABLE(表序列)、UUID 和 AUTO_INCREMENT(自增)。其中,AUTO_INCREMENT 策略是与 MySQL 自增主键类似的方式,适用于单表插入操作。...
多主键,也称为复合主键或联合主键,指的是在一个数据表中使用两个或更多的字段共同作为唯一标识符,确保每条记录的唯一性。这种设计常见于关系型数据库中,当单一字段不足以唯一标识一条记录时采用。例如,在一个...
第1课 课程内容 6 第2课 Hibernate UML图 6 第3课 风格 7 第4课 资源 7 第5课 环境准备 7 ...三、 联合主键 24 1、xml方式 24 2、annotation方式 27 第14课 Hibernate核心开发接口(重点) 29 ........
1. 使用`@IdClass`或XML中的`composite-id`定义联合主键。 2. 联合主键需要重写equals和hashCode方法,实现Serializable接口。 七、Hibernate核心接口 1. `Configuration`接口: - 提供了管理配置信息的方法,用于...
- 订单项表(orderitem):用于存储订单与商品的多对多关系,包含order_id、product_id和buynum字段,order_id和product_id作为联合主键。 五、数据库环境与工程搭建 1. 创建名为"estoresystem"的数据库,并导入...
Hibernate提供了多种主键生成策略,如`GenerationType.AUTO`、`GenerationType.IDENTITY`等,通过`@GeneratedValue`注解来指定: ```java @Entity public class User { @Id @GeneratedValue(strategy = ...
5. **联合主键**:在处理具有联合主键的关联映射时,可以使用`<id>`标签内的多个`column`属性来定义。 6. **级联操作**:通过在`<association>`或`<collection>`标签中设置`cascade`属性,可以实现插入、更新和删除...
这里,@GeneratedValue用于指定主键生成策略,IDENTITY表示自动增长。 2.2 Column注解:用于指定字段映射到数据库的列名和类型,如: ```java @Column(name = "username", nullable = false) private String ...
请注意,这里面有一个方法名 selectUserByID 必须与 User.xml 里面配置的 select 的id 对应(<select id="selectUserByID") 重写测试代码 程序代码 程序代码 public static void main(String[] args) { ...
#### 四、联合主键 在Hibernate中,可以使用复合主键来表示具有多个字段作为主键的实体。以下是一种定义复合主键的方法: ```xml <composite-id> <key-property name="stuName"></key-property> ...
MyBatis Generator(MBG)是一款强大的工具,用于自动生成MyBatis的Mapper接口、XML映射文件以及实体类,从而极大地提高了开发效率。然而,在使用MBG时,可能会遇到一些问题,比如“Table Configuration product ...
`id`元素定义了实体的主键,`generator`子元素则定义了主键的生成策略。在示例中,`increment`策略表示主键值会在每次插入新记录时自动递增。 4. 关联映射 Hibernate支持一对一、一对多、多对一、多对多四种关联...
这里,`@Entity`标识`User`类为实体,`@Table`指定了对应的数据库表,`@Id`和`@GeneratedValue`定义了主键的生成策略。 4. 关联关系注解 当处理实体之间的关联时,我们需要使用关联注解。例如,`User`与`Role`的...
Hibernate 提供了多种继承映射策略,如 `@Inheritance(strategy=InheritanceType.SINGLE_TABLE)`、`@DiscriminatorColumn` 和 `@DiscriminatorValue`,以支持单表继承、子类表和联合主键等。 #### 映射关联关系 - ...