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的表中
删:当删除子类中某条数据 在父类中也会自动级联删除