注解高级(原文再续书接上一回)
7.继承映射
第一种:InheritanceType.JOINED 查询时会出现很多join语句.
1 package com.rong.entity.joined; 2 ?3 import javax.persistence.Entity; 4 import javax.persistence.GeneratedValue; 5 import javax.persistence.GenerationType; 6 import javax.persistence.Id; 7 import javax.persistence.Inheritance; 8 import javax.persistence.InheritanceType; 9 import javax.persistence.Table;10 11 @Entity12 @Table(name="person")13 //所有的持久化都会生成表(子类表会引用父类表的主键列)14 //每个类都会生成一张表15 //子类的表中会默认引用父类中的id16 @Inheritance(strategy=InheritanceType.JOINED)17 public class Person {18 ????@Id19 ????@GeneratedValue(strategy=GenerationType.AUTO)20 ????private int id;21 ????private String name;22 ????private int age;23 ????public int getId() {24 ????????return id;25 ????}26 ????public void setId(int id) {27 ????????this.id = id;28 ????}29 ????public String getName() {30 ????????return name;31 ????}32 ????public void setName(String name) {33 ????????this.name = name;34 ????}35 ????public int getAge() {36 ????????return age;37 ????}38 ????public void setAge(int age) {39 ????????this.age = age;40 ????}41 ????@Override42 ????public String toString() {43 ????????return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";44 ????}45 }
1 package com.rong.entity.joined; 2 ?3 import javax.persistence.Entity; 4 import javax.persistence.Table; 5 ?6 @Entity 7 @Table(name="student") 8 public class Student extends Person{ 9 ????private String number;10 11 ????public String getNumber() {12 ????????return number;13 ????}14 15 ????public void setNumber(String number) {16 ????????this.number = number;17 ????}18 }
1 package com.rong.test; 2 ?3 import org.hibernate.Session; 4 import org.hibernate.SessionFactory; 5 import org.hibernate.Transaction; 6 import org.hibernate.boot.registry.StandardServiceRegistryBuilder; 7 import org.hibernate.cfg.Configuration; 8 import org.hibernate.service.ServiceRegistry; 9 import org.junit.Test;10 11 import com.rong.entity.joined.Person;12 import com.rong.entity.joined.Student;13 14 public class HibernateTest {15 ????@Test16 ????public void test1(){17 ????????Configuration configuration=new Configuration().configure();18 ????????ServiceRegistry serviceRegistry=new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();19 ????????SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);20 ????????Session session = sessionFactory.openSession();21 ????????Transaction transaction = session.beginTransaction();22 ????????//插入23 ????????Student student=new Student();24 ????????student.setAge(18);25 ????????student.setName("悠悠");26 ????????student.setNumber("654321");27 ????????session.save(student);28 ????????//查询29 ????????Person person=(Person)session.get(Person.class, 1);30 ????????System.out.println(person);31 ????????Student stu=(Student) session.get(Student.class, 1);32 ????????System.out.println(stu.getId()+":"+stu.getName()+":"+stu.getNumber());33 ????????transaction.commit();34 ????????session.close();35 ????????sessionFactory.close();36 ????}37 }
第二种:InheritanceType.SINGLE_TABLE 所有子类属性中不能加非空约束
1 package com.rong.entity.singletable; 2 ?3 import javax.persistence.DiscriminatorColumn; 4 import javax.persistence.DiscriminatorType; 5 import javax.persistence.DiscriminatorValue; 6 import javax.persistence.Entity; 7 import javax.persistence.GeneratedValue; 8 import javax.persistence.GenerationType; 9 import javax.persistence.Id;10 import javax.persistence.Inheritance;11 import javax.persistence.InheritanceType;12 import javax.persistence.Table;13 14 @Entity15 @Table(name="person")16 @Inheritance(strategy=InheritanceType.SINGLE_TABLE)// 单个表17 @DiscriminatorColumn(name="dc",discriminatorType=DiscriminatorType.INTEGER)//辨别者列18 @DiscriminatorValue(value="0")// 辨别者列值19 public class Person {20 ????@Id21 ????@GeneratedValue(strategy=GenerationType.AUTO)22 ????private int id;23 ????private String name;24 ????private int age;25 ????public int getId() {26 ????????return id;27 ????}28 ????public void setId(int id) {29 ????????this.id = id;30 ????}31 ????public String getName() {32 ????????return name;33 ????}34 ????public void setName(String name) {35 ????????this.name = name;36 ????}37 ????public int getAge() {38 ????????return age;39 ????}40 ????public void setAge(int age) {41 ????????this.age = age;42 ????}43 ????@Override44 ????public String toString() {45 ????????return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";46 ????}47 }
1 package com.rong.entity.singletable; 2 ?3 import javax.persistence.DiscriminatorValue; 4 import javax.persistence.Entity; 5 import javax.persistence.Table; 6 ?7 @Entity 8 @Table(name="student") 9 @DiscriminatorValue(value="1")// 辨别者列值10 public class Student extends Person{11 ????private String number;12 13 ????public String getNumber() {14 ????????return number;15 ????}16 17 ????public void setNumber(String number) {18 ????????this.number = number;19 ????}20 }
1 package com.rong.test; 2 ?3 import org.hibernate.Session; 4 import org.hibernate.SessionFactory; 5 import org.hibernate.Transaction; 6 import org.hibernate.boot.registry.StandardServiceRegistryBuilder; 7 import org.hibernate.cfg.Configuration; 8 import org.hibernate.service.ServiceRegistry; 9 import org.junit.Test;10 11 import com.rong.entity.singletable.Person;12 import com.rong.entity.singletable.Student;13 14 public class HibernateTest {15 ????@Test16 ????public void test1(){17 ????????Configuration configuration=new Configuration().configure();18 ????????ServiceRegistry serviceRegistry=new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();19 ????????SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);20 ????????Session session = sessionFactory.openSession();21 ????????Transaction transaction = session.beginTransaction();22 ????????//插入23 ????????Student student=new Student();24 ????????student.setAge(16);25 ????????student.setName("晓晓");26 ????????student.setNumber("3824");27 ????????session.save(student);28 ????????Person person=new Person();29 ????????person.setAge(19);30 ????????person.setName("达达");31 ????????session.save(person);32 ????????//查询33 ????????Person per=(Person)session.get(Person.class, 2);34 ????????System.out.println(per);35 ????????Student stu=(Student) session.get(Student.class, 1);36 ????????System.out.println(stu.getId()+":"+stu.getName()+":"+stu.getNumber());37 ????????transaction.commit();38 ????????session.close();39 ????????sessionFactory.close();40 ????}41 }
第三种:InheritanceType.TABLE_PER_CLASS 这种策略主键不能用自增长.查询时会出现union运算.
1 package com.rong.entity.tableperclass; 2 ?3 import javax.persistence.Entity; 4 import javax.persistence.Id; 5 import javax.persistence.Inheritance; 6 import javax.persistence.InheritanceType; 7 import javax.persistence.Table; 8 ?9 @Entity10 @Table(name="person")11 //所有的持久化都会生成表(子类会把父类中的属性继承过来生成在自己的表中)12 @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)13 public class Person {14 ????@Id15 ????private int id;16 ????private String name;17 ????private int age;18 ????public int getId() {19 ????????return id;20 ????}21 ????public void setId(int id) {22 ????????this.id = id;23 ????}24 ????public String getName() {25 ????????return name;26 ????}27 ????public void setName(String name) {28 ????????this.name = name;29 ????}30 ????public int getAge() {31 ????????return age;32 ????}33 ????public void setAge(int age) {34 ????????this.age = age;35 ????}36 ????@Override37 ????public String toString() {38 ????????return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";39 ????}40 }
1 package com.rong.entity.tableperclass; 2 ?3 import javax.persistence.Entity; 4 import javax.persistence.Table; 5 ?6 @Entity 7 @Table(name="student") 8 public class Student extends Person{ 9 ????private String number;10 11 ????public String getNumber() {12 ????????return number;13 ????}14 15 ????public void setNumber(String number) {16 ????????this.number = number;17 ????}18 }
1 package com.rong.test; 2 ?3 import org.hibernate.Session; 4 import org.hibernate.SessionFactory; 5 import org.hibernate.Transaction; 6 import org.hibernate.boot.registry.StandardServiceRegistryBuilder; 7 import org.hibernate.cfg.Configuration; 8 import org.hibernate.service.ServiceRegistry; 9 import org.junit.Test;10 11 import com.rong.entity.tableperclass.Student;12 public class HibernateTest {13 ????@Test14 ????public void test1(){15 ????????Configuration configuration=new Configuration().configure();16 ????????ServiceRegistry serviceRegistry=new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();17 ????????SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);18 ????????Session session = sessionFactory.openSession();19 ????????Transaction transaction = session.beginTransaction();20 ????????//插入21 ????????Student student=new Student();22 ????????student.setId(1);23 ????????student.setAge(20);24 ????????student.setName("扣扣");25 ????????student.setNumber("1224832");26 ????????session.save(student);27 ????????//查询28 ????????Student stu=(Student) session.get(Student.class, 1);29 ????????System.out.println(stu.getId()+":"+stu.getName()+":"+stu.getNumber()30 ????????????????????????????+":"+stu.getAge());31 ????????transaction.commit();32 ????????session.close();33 ????????sessionFactory.close();34 ????}35 }
Hibernate(五)
原文地址:https://www.cnblogs.com/57rongjielong/p/8279079.html