hibernate 常用注解(1)OneToOne

什么是级联:
级联是用来设计一对多关系的。例如一个表存放老师的信息:表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; }}

 


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值