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的表中
刪:當刪除子類中某條數據 在父類中也會自動級聯刪除
總結
以上是生活随笔為你收集整理的java联合主键_hibernate联合主键映射(注解版)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gns3中两个路由器分别连接主机然后分析
- 下一篇: webrtc 代码_英特尔开源WebRT