什么是级联:
级联是用来设计一对多关系的。例如一个表存放老师的信息:表A(姓名,性别,年龄),姓名为主键。还有一张表存放老师所教的班级信息:表B(姓名,班级)。他们通过姓名来级联。级联的操作有级联更新,级联删除。 在启用一个级联更新选项后,就可在存在相匹配的外键值的前提下更改一个主键值。系统会相应地更新所有匹配的外键值。如果在表A中将姓名为张三的记录改为李四,那么表B中的姓名为张三的所有记录也会随着改为李四。级联删除与更新相类似。如果在表A中将姓名为张三的记录删除,那么表B中的姓名为张三的所有记录也将删除。
hibernate 有一对多,一对一,多对多:
拿一对多来说吧,举例说明,订单和条目,一个订单Order 包含多个条目Item,这个就是个一对多的关系,那么在表Item中肯定有一个orderId 是引用Order表中的主键ID。 类的设计: 在Order 中可以设置一个Set<Item> items;表示包含多个条目; 在Item中可以设置一个Order order;表示属于某个订单;
例子:
建表语句:
DROP TABLE IF EXISTS `t_card`; CREATE TABLE `t_card` ( `cardId` int(10) unsigned NOT NULL AUTO_INCREMENT, `cardNumber` char(18) NOT NULL, PRIMARY KEY (`cardId`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=gb2312; INSERT INTO `t_card` VALUES ('1', '440911199008011122');
DROP TABLE IF EXISTS `t_person`; CREATE TABLE `t_person` ( `personId` int(10) unsigned NOT NULL AUTO_INCREMENT, `personName` varchar(15) NOT NULL, `cid` int(10) unsigned NOT NULL, PRIMARY KEY (`personId`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=gb2312; INSERT INTO `t_person` VALUES ('1', 'fancy', '1');
Person.java
package com.fancy.po; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToOne; import javax.persistence.Table; /** * ----------------------------------------- * @描述: 实体类 * ----------------------------------------- */ /** * @Entity 声明一个类为实体Bean * @Table(name = "xx")指定实体类映射的表,如果表名和实体类名一致,可以不指定 */ @Entity @Table(name = "t_person") public class Person { private Integer personId; private String personName; private Card card; /** * @Id 映射主键属性,这里采用uuid的主键生成策略 * @GeneratedValue —— <pre name="code" class="java" style="color: rgb(51, 51, 51); font-size: 14px; line-height: 24px;"><span style="white-space:pre"> </span>默认是GenerationType. AUTO!
public void setPersonId(Integer personId) { this.personId = personId; }
注解声明了主键的生成策略。该注解有如下属性 * strategy 指定生成的策略,默认是GenerationType. AUTO! * GenerationType.AUTO 主键由程序控制 * GenerationType.TABLE 使用一个特定的数据库表格来保存主键 * GenerationType.IDENTITY 主键由数据库自动生成,主要是自动增长类型 * GenerationType.SEQUENCE 根据底层数据库的序列来生成主键,条件是数据库支持序列 * generator 指定生成主键使用的生成器 */ @Id @GeneratedValue public Integer getPersonId() { return personId; }
<pre name="code" class="java" style="color: rgb(51, 51, 51); font-size: 14px; line-height: 24px;"> public void setPersonId(Integer personId) { this.personId = personId; }
<pre name="code" class="java" style="color: rgb(51, 51, 51); font-size: 14px; line-height: 24px;"> public String getPersonName() { return personName; } public void setPersonName(String personName) { this.personName = personName; }
/** * @OneToOne:一对一关联 * cascade:级联,它可以有有五个值可选,分别是: * CascadeType.PERSIST:级联新建 * CascadeType.REMOVE : 级联删除 * CascadeType.REFRESH:级联刷新 * CascadeType.MERGE : 级联更新 * CascadeType.ALL : 以上全部四项 * @JoinColumn:主表外键字段 * cid:Person所映射的表中的一个字段 */ @OneToOne(cascade = CascadeType.ALL) @JoinColumn(name = "cid") public Card getCard() { return card; } public void setCard(Card card) { this.card = card; }}
Card.java
package com.fancy.po; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.OneToOne; import javax.persistence.Table; /** * ----------------------------------------- * @描述: 实体类 * ----------------------------------------- */ @Entity @Table(name = "t_card") public class Card { private Integer cardId; private String cardNumber; private Person person; @Id @GeneratedValue(strategy = GenerationType.AUTO) public Integer getCardId() { return cardId; }
<pre name="code" class="java" style="color: rgb(51, 51, 51); font-size: 14px; line-height: 24px;"> public void setCardId(Integer cardId) { this.cardId = cardId; }
public String getCardNumber() { return cardNumber; } public void setCardNumber(String cardNumber) { this.cardNumber = cardNumber; }
/** * @OneToOne:一对一关联 * mappedBy = "card":意思是说这里的一对一配置参考了card * card又是什么呢?card是Person类中的getCard(),注意不是Person类中的 * card属性,Person类中的OneToOne配置就是在getCard()方法上面配的. * 如果Person类中的getCard()方法改成getIdCard(),其他不变的话, * 这里就要写成:mappedBy = "idCard" */ @OneToOne(mappedBy = "card") public Person getPerson() { return person; } public void setPerson(Person person) { this.person = person; }}
相关推荐
#### 一、JPA与Hibernate注解基础 JPA(Java Persistence API)是一种标准规范,用于实现对象关系映射(ORM),允许开发人员使用注解或XML来描述实体对象与数据库表之间的映射关系。Hibernate是JPA的一种实现,它...
**Hibernate 3 注解技术详解** 在Java世界中,Hibernate是一个强大的对象关系映射(ORM)框架,它极大地简化了数据库操作。 Hibernate 3引入了注解支持,使得开发人员无需XML配置文件即可进行对象持久化,提高了...
本文档将深入探讨Hibernate注解的使用,帮助开发者更好地理解和利用这些注解来实现对象关系映射(ORM)。 一、Hibernate注解基础 Hibernate注解是一种元数据方式,用于在Java类和属性上声明数据库映射信息,从而...
在Hibernate中,关系注解用于在实体类中定义不同类型的数据库关系,如一对一、一对多、多对多等。以下是关于Hibernate关系注解的详细说明: 1. **一对一外键关联映射(单向)** 使用`@OneToOne`注解实现一对一关系...
在`Hibernate`中,我们还可以使用注解来处理关联关系,如`@ManyToOne`, `@OneToMany`, `@OneToOne`和`@ManyToMany`,它们分别对应一对一、一对多、多对一和多对多的关系。例如,一个用户可以有多个订单,那么在订单...
对于自关联,即一个实体类实例可以关联自身,我们同样可以使用`@ManyToOne`或`@OneToOne`注解,根据实际需求选择合适的关联类型,并通过`mappedBy`来定义关联路径。 在多对一的关联关系中,我们通常在“一”的那...
1. **@OneToOne** 注解:在单向一对一关系中,此注解用在主实体的属性上。而在双向一对一关系中,双方都需要`@OneToOne`,并使用`mappedBy`属性指定对方。 2. **@PrimaryKeyJoinColumn**:如果关联的两个实体使用...
本实例"spring-hibernate注解配置源码"旨在展示如何在不使用XML配置的情况下,通过注解的方式整合Struts2、Spring和Hibernate,创建一个完整的MVC(模型-视图-控制器)架构的应用。下面将详细介绍这个过程中的关键...
* 双线一对一映射:基于外键使用 @OneToOne 注解,基于主键使用 Hibernate 的扩展注解。 在映射关联关系时,需要注意以下几点: * mappedBy 属性:用在双向关联中,把关系的维护权反转。 * cascade 属性:指定级联...
1. **Hibernate4简介**: Hibernate4是Hibernate ORM的第四个主要版本,它引入了许多新特性,如JPA 2.0支持、对Java 7的优化以及更好的性能。 2. **注解配置**:在Hibernate4中,我们可以使用注解来替代XML配置文件...
本主题将深入探讨Hibernate注解的相关知识点。 1. **注解概述**: 注解(Annotations)是Java 5引入的一种元数据,它提供了在源代码中嵌入信息的方式,这些信息可以被编译器或者在运行时的Java虚拟机使用。在...
1. 实体映射注解:定义如何将Java类的属性映射到数据库表中的列。例如,使用@Entity注解来标记一个类作为实体类,@Table注解用来指定实体映射到的数据库表。@Column注解用于指定属性映射到表中的具体列。 2. 关联...
首先,让我们理解Hibernate注解的基本概念。注解是一种元数据,它允许我们向编译器或JVM提供有关代码的信息。在Hibernate中,注解用于定义实体类、属性、关联关系等,使得Hibernate能够自动处理这些对象与数据库表...
### Hibernate注解API知识点概述 #### 一、Hibernate注解简介 Hibernate 是一款非常流行的 Java 持久层框架,它极大地简化了数据库操作。在 Hibernate 中,可以通过使用注解来映射对象与数据库表之间的关系,从而...
在Hibernate中,可以通过@OneToOne注解来实现这种关系。例如: ```java @Entity public class User { @Id private Long id; @OneToOne(mappedBy = "user") private Profile profile; } @Entity public class...
这可以通过在映射文件中设置`<one-to-one>`标签或者使用Java注解`@OneToOne`来实现。 2. **共享主键关联**:两个实体类共用同一个主键,这意味着它们在数据库中实际上是同一个表的不同视图。这可以通过`@...
在本文中,我们将深入探讨Hibernate注解的几个核心方面:级联关系、增删改查操作、二级缓存、日志配置以及注解解析。 1. **级联关系**: Hibernate中的级联关系允许我们在一个实体的操作中自动处理与其关联的其他...
1. **实体类注解**: - `@Entity`:标记一个Java类为数据库中的一个实体表,相当于传统的Hibernate配置文件中的映射文件。 - `@Table`:用于指定实体类对应的数据库表名,可以设置其他如schema、catalog等属性。 ...
1. **实体注解(@Entity)** `@Entity` 注解用于标记一个Java类为Hibernate的实体类,它对应数据库中的一个表。例如: ```java @Entity public class User { // ... } ``` 这表示User类将映射到数据库中的一个...