您的位置:首页 > 其它

hibernate继承关系的映射(single_table,class_per_table,joined)

2015-04-29 13:23 405 查看
转自:http://blog.csdn.net/centre10/article/details/6092942

hibernate对象之间存在继承关系,该如何映射呢?有3中方式,反映在数据库表上:
Single table:Student和Teacher类的父类是Person类,用一张数据库表反应3个类的所有信息。这样设计的缺点是:表的信息反映了所有类的属性,造成大量的数据冗余。
Table per class:为每个类设计一张表,其缺点是:
Joined:用一张表存共有的字段,而其子类对应的表存其特有字段。优缺点:查询能提高效率,然而需要作表连接,当添加新的子类时,需要添加新的表。
Annotation:
⑴sigle_table:
package com.xie.hibernate.modal;
import java.util.ArrayList;

import java.util.HashMap;

import java.util.HashSet;

import java.util.List;

import java.util.Map;

import java.util.Set;
import javax.persistence.CascadeType;

import javax.persistence.Column;

import javax.persistence.DiscriminatorColumn;

import javax.persistence.DiscriminatorType;

import javax.persistence.DiscriminatorValue;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.Id;

import javax.persistence.Inheritance;

import javax.persistence.InheritanceType;

import javax.persistence.JoinColumn;

import javax.persistence.MapKey;

import javax.persistence.OneToMany;

import javax.persistence.Table;
import com.sun.xml.internal.bind.v2.runtime.Name;

@Entity

//指定继承映射的策略

@Inheritance(strategy=InheritanceType.SINGLE_TABLE)

//在数据库表中加上一个字段,用以区分是哪个子类,name表示表的字段名字,discriminatorType

//表示name字段的数据类型

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

//指定这个类存到数据库中用什么区分,value表明dis的值

@DiscriminatorValue(value="person")

public class Person {

private int id;

private String name;

@Id

@GeneratedValue

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.xie.hibernate.modal;
import javax.persistence.CascadeType;

import javax.persistence.Column;

import javax.persistence.DiscriminatorValue;

import javax.persistence.Entity;

import javax.persistence.FetchType;

import javax.persistence.GeneratedValue;

import javax.persistence.Id;

import javax.persistence.JoinColumn;

import javax.persistence.ManyToOne;

import javax.persistence.Table;
@Entity

@DiscriminatorValue("student")

public class Student extends Person {

private int score;
public int getScore() {

return score;

}
public void setScore(int score) {

this.score = score;

}

}
package com.xie.hibernate.modal;
import java.util.ArrayList;

import java.util.HashMap;

import java.util.HashSet;

import java.util.List;

import java.util.Map;

import java.util.Set;
import javax.persistence.CascadeType;

import javax.persistence.Column;

import javax.persistence.DiscriminatorValue;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.Id;

import javax.persistence.JoinColumn;

import javax.persistence.MapKey;

import javax.persistence.OneToMany;

import javax.persistence.Table;
@Entity

@DiscriminatorValue("teacher")

public class Teacher extends Person{

private String title;
public String getTitle() {

return title;

}
public void setTitle(String title) {

this.title = title;

}

}

⑵table_per_class:

package com.xie.hibernate.modal;
import java.util.ArrayList;

import java.util.HashMap;

import java.util.HashSet;

import java.util.List;

import java.util.Map;

import java.util.Set;
import javax.persistence.CascadeType;

import javax.persistence.Column;

import javax.persistence.DiscriminatorColumn;

import javax.persistence.DiscriminatorType;

import javax.persistence.DiscriminatorValue;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.GenerationType;

import javax.persistence.Id;

import javax.persistence.Inheritance;

import javax.persistence.InheritanceType;

import javax.persistence.JoinColumn;

import javax.persistence.MapKey;

import javax.persistence.OneToMany;

import javax.persistence.Table;

import javax.persistence.TableGenerator;
import com.sun.xml.internal.bind.v2.runtime.Name;

@Entity

//指定继承映射的策略

@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)

@TableGenerator(

name="k_gen",

table="key_table",

pkColumnName="p_key",

pkColumnValue="p_value",

initialValue=1,

allocationSize=1

)

public class Person {

private int id;

private String name;

@Id

@GeneratedValue(generator="k_gen",strategy=GenerationType.TABLE)

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.xie.hibernate.modal;
import java.util.ArrayList;

import java.util.HashMap;

import java.util.HashSet;

import java.util.List;

import java.util.Map;

import java.util.Set;
import javax.persistence.CascadeType;

import javax.persistence.Column;

import javax.persistence.DiscriminatorValue;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.Id;

import javax.persistence.JoinColumn;

import javax.persistence.MapKey;

import javax.persistence.OneToMany;

import javax.persistence.Table;
@Entity

public class Teacher extends Person{

private String title;
public String getTitle() {

return title;

}
public void setTitle(String title) {

this.title = title;

}

}

⑶joined:

package com.xie.hibernate.modal;
import java.util.ArrayList;

import java.util.HashMap;

import java.util.HashSet;

import java.util.List;

import java.util.Map;

import java.util.Set;
import javax.persistence.CascadeType;

import javax.persistence.Column;

import javax.persistence.DiscriminatorColumn;

import javax.persistence.DiscriminatorType;

import javax.persistence.DiscriminatorValue;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.GenerationType;

import javax.persistence.Id;

import javax.persistence.Inheritance;

import javax.persistence.InheritanceType;

import javax.persistence.JoinColumn;

import javax.persistence.MapKey;

import javax.persistence.OneToMany;

import javax.persistence.Table;

import javax.persistence.TableGenerator;
import com.sun.xml.internal.bind.v2.runtime.Name;

@Entity

//指定继承映射的策略

@Inheritance(strategy=InheritanceType.JOINED)
public class Person {

private int id;

private String name;

@Id

@GeneratedValue

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.xie.hibernate.modal;
import javax.persistence.CascadeType;

import javax.persistence.Column;

import javax.persistence.DiscriminatorValue;

import javax.persistence.Entity;

import javax.persistence.FetchType;

import javax.persistence.GeneratedValue;

import javax.persistence.Id;

import javax.persistence.JoinColumn;

import javax.persistence.ManyToOne;

import javax.persistence.Table;
@Entity

public class Student extends Person {

private int score;
public int getScore() {

return score;

}
public void setScore(int score) {

this.score = score;

}

}

package com.xie.hibernate.modal;
import java.util.ArrayList;

import java.util.HashMap;

import java.util.HashSet;

import java.util.List;

import java.util.Map;

import java.util.Set;
import javax.persistence.CascadeType;

import javax.persistence.Column;

import javax.persistence.DiscriminatorValue;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.Id;

import javax.persistence.JoinColumn;

import javax.persistence.MapKey;

import javax.persistence.OneToMany;

import javax.persistence.Table;
@Entity

public class Teacher extends Person{

private String title;
public String getTitle() {

return title;

}
public void setTitle(String title) {

this.title = title;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: