java联合主键_hibernate联合主键映射(注解版)

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的表中

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/504857.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 如何边改代码边调试_Python 代码调试神器:PySnooper

给大家推荐本我自己写的电子书《PyCharm中文指南》,把各种 PyCharm 的高效的使用技巧用GIF动态图的形式展示出来。有兴趣的可以看它的在线文档:http://pycharm.iswbm.com对于每个程序开发者来说,调试几乎是必备技能。代码写到一半卡住了&…

python 代理服务器_Python实现HTTP代理服务器

这些天闲来无事就研究了下HTTP代理原理,顺便用Python做了个很挫的程序。import socketimport threadingclass ProxyServer():def __init__(self):self.ListenSock socket()self.ListenSock.bind()self.Clients []def listen_thread(self):self.ListenSock.listen(…

java 如何导出json文件_java导出json格式文件的示例代码

本文介绍了java导出json格式文件的示例代码,分享给大家,具体如下:import java.io.File;import java.io.FileWriter;import java.io.Writer;public class CreateFileUtil {/*** 生成.json格式文件*/public static boolean createJsonFile(Stri…

python执行shell命令、并获取执行过程信息_python执行使用shell命令方法

1. os.system(shell_command)直接在终端输出执行结果,返回执行状态0,1此函数会启动子进程,在子进程中执行command,并返回command命令执行完毕后的退出状态,如果command有执行内容,会在标准输出显示。这实际上是使用C标…

java安全框架有哪些_Java开发必备教程-细说Spring Security安全框架

一、Spring Security介绍spring security 是基于 spring 的安全框架。它提供全面的安全性解决方案,同时在 Web 请求级和方法调用级处理身份确认和授权。在 Spring Framework 基础上,spring security 充分利用了依赖注入(DI)和面向切面编程(AOP)功能&…

无法读取源文件或磁盘_raid磁盘阵列作用

磁盘阵列的作用:1.提高传输速率。RAID通过在多个磁盘上同时存储和读取数据来大幅提高存储系统的数据吞吐量(Throughput)。在RAID中,可以让很多磁盘驱动器同时传输数据,而这些磁盘驱动器在逻辑上又是一个磁盘驱动器,所以使用RAID可…

java none怎么用tomcat_JavaWeb学习——在Eclipse里使用Tomcat

JavaWeb学习——在Eclipse里使用Tomcat摘要:本文主要学习了如何在Eclipse里使用Tomcat服务器。添加Tomcat打开Eclipse的配置页面,点击菜单上的“Window”,在下拉菜单中找到“Preferences”:找到运行环境的配置页面,如果…

mysql b 树原因_复习系列之数据库(四):MySQL为什么采用B+树作为索引结构?

MySQL中数据是索引组织表,即表中数据按照主键顺序存放。所以就可以基于索引这种数据结构实现一些高级算法,来提高检索效率。常见的查找算法顺序查找:复杂度O(n),在数据量大时,效率很低二分查找:在有序为前提…

关于python类_python中类的总结

1、 类中的方法在类里主要有三种方法:a、普通方法:在普通方法定义的时候,需要一个对象的实例参数,从而在类中定义普通方法的时候,都必须传送一个参数self,那么这个参数也就是objectb、类方法:在…

折线图 java_java报表折线图

package com.potevio.rnd.tobacco.mine;import java.util.Map;/*** description 数据BEAN* author Zhou-Jingxian*/public class Bean {private String goods_name ;private Map priceindexMap;public String getGoods_name() {return goods_name;}public void setGoods_name(S…

windows无法检索有关这台计算机上的磁盘信息_磁盘镜像软件OO DiskImage Pro 15.5介绍及安装教程...

Active Disk Image是一种磁盘映像软件,可以精确复制任何PC磁盘(HDD,SSD,USB,CD,DVD,Blu-ray等)并将其存储在文件夹中。磁盘映像可用于备份,PC升级或磁盘复制。万一计算机出现故障,可…

java中的抽象方法_Java中的抽象类和抽象方法

###Java中的抽象方法和抽象类:abstract:关键字,可以用于修饰方法和类抽象方法:不同类的方法是相似的,但是具体实现的内容又不太一样,没有具体的方法体。抽象类:有抽象方法的类必须是抽象类类与抽象类的关系…

word手写字体以假乱真_Word小技巧|打印作文草稿纸

前期介绍过一些Word使用中的小技巧,例如WORD快速查找的2个小技巧 https://www.iappi.cn/2019_08/20191147.html,使用Word创建九宫格图像 https://www.iappi.cn/2019_07/20191064.html 等。今天再分享一个打印作文草稿纸的技巧。很多时候需要规范写好作文…

java 判断范围_java判断一个点是否在一个围栏范围内

应项目需求,需要判断一个点所属哪个区域范围内管辖,突然想起来三年前做了个外卖的项目里面有个功能,判断用户是否在商家自己划的配送范围内,又找回来以前的代码来看了下,所以在此处记录一下DataNoArgsConstructorAllAr…

概要设计说明书_没有什么比牙签更好的设计了

牙签是设计公理的典型例子,形式服从功能。它的形式和功能是单一的、紧凑的、轻质的、可生物降解的、可持续的实体。不证自明的:它的形状是设计功能的缩影,同时作为手柄和说明书。它的形状不仅告诉你如何握住和使用它,而且告诉你把…

java项目log4j_java项目测试log4j

一、基础入门1.1 下载安装下载相应的log4j-1.2.15.jar(也可以下载其他的版本)提供一个下载jar包的网站(http://search.maven.org/)新建一个log4j.properties文件:#配置根Loggerlog4j.rootLoggerinfo, RF #info代表的是日志输出的级别log4j.appender.RForg.apache.lo…

webrtc 代码_英特尔开源WebRTC开发套件OWT

为了抢占实时视频的巨大市场,英特尔开源了WebRTC开发套件,并将其命名为Open WebRTC Toolkit (OWT)。由于实时视频编码、转码需要大量的计算资源,Open WebRTC Toolkit将为英特尔带来巨大的潜在商业回报。文 / Ant去年在旧金山举办的2018 Krank…

零基础自学java_零基础学Java——小白的Java之路(4)

方法方法是一段可以重复调用的代码块,这个代码块实现了某个功能,当我们的程序中需要这一个功能的时候,调用这个方法即可,不再需要重复书写这个功能的代码。方法的定义格式public static ( ,... ){方法体;[return 表达值…

异步fifo_跨时钟域同步(异步FIFO)

本文使用 Zhihu On VSCode 创作并发布跨时钟域同步(异步FIFO)之前学习了跨时钟域下的单bit信号同步的方法,这些单bit信号多是作为控制信号或者标志信号来使用,再实际的项目中,处理多bit数据也是十分常见的,…

think python 2ed_Think Python 2ed 笔记(二)

第六章 有返回值的函数1. 返回值:没有返回值的函数返回None2. 增量式开发:增量式开发的目标,是通过每次只增加和测试少量代码,来避免长时间的调试。该函数的最终版不会在运行时显示任何东西,仅仅返回一个值。 我们之前…