1、联合主键的映射三种写法

实体类:

package com.zhouwei.po;

import javax.persistence.Entity;

import javax.persistence.Id;

import javax.persistence.IdClass;

import javax.persistence.Table;

//联合主键(通过id和name确定一个人)

@Entity

@Table(name="t_person")

@IdClass(PersonPK.class)

public class Person {

//private

PersonPK personPk;

@Id

private int id;

@Id

private String name;

private int age;

//@Id //第一种方式

//@EmbeddedId 第二种方式

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

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;

}

}

主键类:

package com.zhouwei.po;

import java.io.Serializable;

//@Embeddable //第一种方式

public class PersonPK implements

Serializable{

private int id;

private String name;

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;

}

}

1、继承类表的映射三种写法

* 一、把三个类设计为同一个表 加一个type字段用来标识是动物还是狗或者猫

* 缺点:大量冗余 好多的字段的值为空比如保存的是狗那所有猫的属性都是为空的

第一种:

父类:Animal

@Entity

@Inheritance(strategy=InheritanceType.SINGLE_TABLE)

@DiscriminatorColumn(name="type",discriminatorType=DiscriminatorType.STRING)

//name是新加字段的名称

//discriminatorType区别的字段类型 可以为int,char或String等

@DiscriminatorValue("animal")

//当为animal时存的区别值,即查询type值为animal时即为Animal

public class Animal {

private int id;

private String name;

@Id

@GeneratedValue

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

@Column(length=30)

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

子类:Dog

@Entity

@DiscriminatorValue("dog")

public class Dog extends Animal{

private String hari;

@Column(length=30)

public String getHari() {

return hari;

}

public void setHari(String hari) {

this.hari = hari;

}

}

子类:Cat

@Entity

@DiscriminatorValue("cat")

public class Cat extends Animal {

private String eye;

@Column(length=30)

public String getEye() {

return eye;

}

public void setEye(String eye) {

this.eye = eye;

}

}

Animal:

id

name

Dog

id

hair

Cat

id

eye

Dog和cat表中的id是作为外键关联到Animal中的id

第二种:把三个类设计成对应的三张表

* 缺点:三张表的id不能自动生成,必须建立一个序列的表去存储主键而

*

把这三张表的主键作为外键关联到序列表(如果Oracle就不用这样设计,因为Oracle里有序列)

第三种:把三个表设计成对应的三张表 与二不同的是子类表里只存储自己的字段从父类继承的字段不存储

* 主键关联到父类的主键(最优)

当插入一条数据进子类的表中时,会自动将对应的字段保存到父类表中 例子见下面的test

@Entity

@Inheritance(strategy=InheritanceType.JOINED)

public class Animal {

private int id;

private String name;

@Id

@GeneratedValue

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

@Column(length=30)

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

Dog:

@Entity

@PrimaryKeyJoinColumn(name="dogId")

public class Dog extends Animal{

private String hari;

@Column(length=30)

public String getHari() {

return hari;

}

public void setHari(String hari) {

this.hari = hari;

}

}

Cat:

@Entity

@PrimaryKeyJoinColumn(name="catId")

public class Cat extends Animal {

private String eye;

@Column(length=30)

public String getEye() {

return eye;

}

public void setEye(String eye) {

this.eye = eye;

}

}

Test:

ts.begin();

Dog dog =

new Dog();

dog.setName("dog");

dog.setHari("red");

session.save(dog);

Cat cat =

new Cat();

cat.setName("cat");

cat.setEye("blue");

session.save(cat);

ts.commit();

存:

通过对子类属性的保存自动将name和id保存到父类Animal的表中

删:当删除子类中某条数据 在父类中也会自动级联删除

java联合主键_hibernate联合主键映射(注解版)相关推荐

  1. JAVA实现导出mysql表结构到Word详细注解版

    JAVA实现导出mysql表结构到Word详细注解版 转自https://blog.csdn.net/weixin_42041153/article/details/109739073 本文在原文中一 ...

  2. Java实体类设置联合主键_Hibernate 注解方式设置联合主键

    使用 Annotation 设置联合主键有三种方式: 1. 方法一 主键类:将联合主键的字段单独放在类中,该类实现 java.io.Serializable 接口,并重写 equals 和 hasco ...

  3. java联合主键_Hibernate注解映射联合主键的三种主要方式

    今天在做项目的时候,一个中间表没有主键,所有在创建实体的时候也未加组件,结果报以下错误: org.springframework.beans.factory.BeanCreationException ...

  4. Oracle主键和联合主键

    在oracle数据库中,一张表中的每一行数据被称为一条记录.一条记录通常都是由多个字段所组成的. 例如,employees表的四行记录: 每一条记录都包含者若干个已经定义好的字段.同一个表的所有记录都 ...

  5. 超键、候选键、主键、外键、联合主键、复合主键

    首先看看各种键的定义: 超键(super key):在关系中能唯一标识元组的属性集称为关系模式的超键(只要有一个键唯一,再随便组其他的键,合起来叫主键) 候选键(candidatekey):不含有多余 ...

  6. 数据库原理与应用(SQL Server)教程 主键、外键以及联合主键、复合主键和设置种子数目和增量

    文章目录 前言 一.主键.联合主键和复合主键 (一)主键 (二)联合主键 (三)复合主键 二.外键.设置种子数目和增量 (一)外键的概念 (二)添加外键 (三)设置种子数目和增量 结语 前言 这篇文章 ...

  7. 数据库中复合主键与联合主键

    复合主键(单表多个主键) 复合主键:数据库表的主键由两个及以上的字段组成. 例如: CREATE TABLE `asm_device_config_info` ( `asmModel` varchar ...

  8. 2019-7-27 [MySQL] DQL 简单查询[别名/去重/运算] 条件查询 排序查询 聚合查询 分组查询 导出与导入 多表操作[一对多/多对多][创外键 创联合主键 约束 添加 删除 测试]

    文章目录 5 SQL语句(DQL) 5.1DQL准备工作和语法 5.1.1准备工作 5.1.2 DQL语法: 5.2 简单查询 5.2.1 查询所有的商品 5.2.2 查询商品名和商品价格. 5.2. ...

  9. mysql 联合主键重复数据库_联合主键和复合主键有什么区别

    联合主键和复合主键有什么区别 发布时间:2020-07-11 09:52:20 来源:亿速云 阅读:171 作者:Leah 这期内容当中小编将会给大家带来有关联合主键和复合主键有什么区别,文章内容丰富 ...

最新文章

  1. html页面获取get传递过来的值,在HTML中用js获取通过GET、POST方法(就是在网址后加?a=bc=d之类)传过来的表单值...
  2. ffmpeg 移植到 android 并使用
  3. php分享十五:php的数据库操作
  4. Python 之 风格规范(Google )
  5. DL之NN:基于(sklearn自带手写数字图片识别数据集)+自定义NN类(三层64→100→10)实现97.5%准确率
  6. h5页面不可 移动_H5营销|为什么H5适合于微信营销
  7. HDU 2208 唉,可爱的小朋友(DFS)
  8. java jlist删除选中的项_java jlist removeListSelectionListener 怎样删除已经建好的 ListSelectionListener...
  9. 罗永浩“卖艺”还债能成?邀约不断,币圈抢着送钱
  10. 推荐分享一个自定义绑定控件(附源码)
  11. 【栈与队列】剑指offer:两个栈模拟队列
  12. 【编辑器】VSCode的Web前端(html,css,JavaScript)开发环境打造
  13. 低字节+高字节+字地址+大端序+小端序全辨析
  14. Xmind8 思维导图
  15. 基于ARM64架构飞腾2000CPU的浪潮CE3000F机器安装银河麒麟系统和Docker
  16. 教育系统APP(四)
  17. 基于Ogre1.9开发的3D场景编辑器
  18. APP游戏运营:如何运用数据来指导手游运营
  19. UITextView 首行缩进
  20. 牛客练习赛97_D 月之暗面

热门文章

  1. Js拼接嵌套php代码,分享一个js文件中嵌套php会出错的问题
  2. catia怎么将特征参数化_搭建商城网站怎么将页面简洁化?这三个步骤不能少
  3. python 创建一个空向量_Python之Django系列-创建第一个应用-5
  4. python百钱买百鸡问题答案_PHP/Python---百钱百鸡简单实现及优化
  5. python paramiko invoke_shell_Python,paramiko,invoke_shell和丑陋的字符
  6. python和pytorch是什么关系_【PyTorch】Tensor和tensor的区别
  7. between and 效率_科学家改进植物光合作用,使植物光合效率提高40%
  8. matplotlib的colorbar自定义刻度范围
  9. Python 学习编程 【for语句breakcontinue语句使用】(一)
  10. 计算机视觉(一)概述