java联合主键_hibernate联合主键映射(注解版)
1、聯(lián)合主鍵的映射三種寫(xiě)法
實(shí)體類:
package com.zhouwei.po;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.Table;
//聯(lián)合主鍵(通過(guò)id和name確定一個(gè)人)
@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、繼承類表的映射三種寫(xiě)法
* 一、把三個(gè)類設(shè)計(jì)為同一個(gè)表 加一個(gè)type字段用來(lái)標(biāo)識(shí)是動(dòng)物還是狗或者貓
* 缺點(diǎn):大量冗余?好多的字段的值為空比如保存的是狗那所有貓的屬性都是為空的
第一種:
父類:Animal
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="type",discriminatorType=DiscriminatorType.STRING)
//name是新加字段的名稱
//discriminatorType區(qū)別的字段類型 可以為int,char或String等
@DiscriminatorValue("animal")
//當(dāng)為animal時(shí)存的區(qū)別值,即查詢type值為animal時(shí)即為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是作為外鍵關(guān)聯(lián)到Animal中的id
第二種:把三個(gè)類設(shè)計(jì)成對(duì)應(yīng)的三張表
* 缺點(diǎn):三張表的id不能自動(dòng)生成,必須建立一個(gè)序列的表去存儲(chǔ)主鍵而
*
把這三張表的主鍵作為外鍵關(guān)聯(lián)到序列表(如果Oracle就不用這樣設(shè)計(jì),因?yàn)镺racle里有序列)
第三種:把三個(gè)表設(shè)計(jì)成對(duì)應(yīng)的三張表?與二不同的是子類表里只存儲(chǔ)自己的字段從父類繼承的字段不存儲(chǔ)
* 主鍵關(guān)聯(lián)到父類的主鍵(最優(yōu))
當(dāng)插入一條數(shù)據(jù)進(jìn)子類的表中時(shí),會(huì)自動(dòng)將對(duì)應(yīng)的字段保存到父類表中 例子見(jiàn)下面的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();
存:
通過(guò)對(duì)子類屬性的保存自動(dòng)將name和id保存到父類Animal的表中
刪:當(dāng)刪除子類中某條數(shù)據(jù) 在父類中也會(huì)自動(dòng)級(jí)聯(lián)刪除
總結(jié)
以上是生活随笔為你收集整理的java联合主键_hibernate联合主键映射(注解版)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: gns3中两个路由器分别连接主机然后分析
- 下一篇: webrtc 代码_英特尔开源WebRT