hibernate--继承映射

一时失言乱红尘 2024-02-18 14:57 103阅读 0赞

对于继承映射表的设计有三种:

以person、student、teacher说明:

一、继承关系树的每个类对应一个表(joined类型):
Center

Person.java:

  1. package com.bean;
  2. import javax.persistence.Entity;
  3. import javax.persistence.GeneratedValue;
  4. import javax.persistence.Id;
  5. import javax.persistence.Inheritance;
  6. import javax.persistence.InheritanceType;
  7. @Entity
  8. @Inheritance(strategy=InheritanceType.JOINED)
  9. public class Person {
  10. private int id;
  11. private String name;
  12. @Id
  13. @GeneratedValue
  14. public int getId() {
  15. return id;
  16. }
  17. public void setId(int id) {
  18. this.id = id;
  19. }
  20. public String getName() {
  21. return name;
  22. }
  23. public void setName(String name) {
  24. this.name = name;
  25. }
  26. }

Student.java:

  1. package com.bean;
  2. import javax.persistence.Entity;
  3. @Entity
  4. public class Student extends Person {
  5. private String num;
  6. public String getNum() {
  7. return num;
  8. }
  9. public void setNum(String num) {
  10. this.num = num;
  11. }
  12. }

Teacher.java:

  1. package com.bean;
  2. import javax.persistence.Entity;
  3. @Entity
  4. public class Teacher extends Person {
  5. private String title;
  6. public String getTitle() {
  7. return title;
  8. }
  9. public void setTitle(String title) {
  10. this.title = title;
  11. }
  12. }

测试类:

  1. package com.test;
  2. import java.util.List;
  3. import java.util.Map;
  4. import org.hibernate.Query;
  5. import org.hibernate.Session;
  6. import org.hibernate.SessionFactory;
  7. import org.hibernate.cfg.AnnotationConfiguration;
  8. import org.hibernate.cfg.Configuration;
  9. import org.hibernate.service.ServiceRegistryBuilder;
  10. import org.hibernate.tool.hbm2ddl.SchemaExport;
  11. import com.bean.Person;
  12. import com.bean.Student;
  13. import com.bean.Teacher;
  14. public class Test_W_H {
  15. public static void main(String []args) {
  16. Configuration cfg = new Configuration();
  17. cfg.configure(); //加载hibernate配置文件
  18. SessionFactory sessionFactory = cfg.buildSessionFactory(new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry());
  19. Session session = sessionFactory.getCurrentSession();
  20. // Student student = new Student();
  21. // student.setName("张三");
  22. // student.setNum("20151080300");
  23. //
  24. // Teacher teacher = new Teacher();
  25. // teacher.setName("Mr.sun");
  26. // teacher.setTitle("教授");
  27. session.beginTransaction(); //开启事务
  28. // session.save(student);
  29. // session.save(teacher);
  30. Student student = (Student)session.load(Student.class, 1);
  31. System.out.println(student.getName());
  32. Person person = (Person)session.load(Person.class, 2);
  33. System.out.println(person.getName());
  34. session.getTransaction().commit(); // 事务提交
  35. System.out.println("the end");
  36. }
  37. }

Hibernate生成的Hql语句:

  1. Hibernate:
  2. select
  3. student0_.id as id0_0_,
  4. student0_1_.name as name0_0_,
  5. student0_.num as num2_0_
  6. from
  7. Student student0_
  8. inner join
  9. Person student0_1_
  10. on student0_.id=student0_1_.id
  11. where
  12. student0_.id=?
  13. 张三
  14. Hibernate:
  15. select
  16. person0_.id as id0_0_,
  17. person0_.name as name0_0_,
  18. person0_1_.title as title1_0_,
  19. person0_2_.num as num2_0_,
  20. case
  21. when person0_1_.id is not null then 1
  22. when person0_2_.id is not null then 2
  23. when person0_.id is not null then 0
  24. end as clazz_0_
  25. from
  26. Person person0_
  27. left outer join
  28. Teacher person0_1_
  29. on person0_.id=person0_1_.id
  30. left outer join
  31. Student person0_2_
  32. on person0_.id=person0_2_.id
  33. where
  34. person0_.id=?
  35. Mr.sun

-——————————————————————————————————————————————-

二、继承关系树的根类对应一个表(single类型)

Center 1

Person.java:

  1. package com.bean;
  2. import javax.persistence.DiscriminatorColumn;
  3. import javax.persistence.DiscriminatorType;
  4. import javax.persistence.DiscriminatorValue;
  5. import javax.persistence.Entity;
  6. import javax.persistence.GeneratedValue;
  7. import javax.persistence.Id;
  8. import javax.persistence.Inheritance;
  9. import javax.persistence.InheritanceType;
  10. @Entity
  11. @Inheritance(strategy=InheritanceType.SINGLE_TABLE)
  12. @DiscriminatorColumn(name = "discriminator",discriminatorType = DiscriminatorType.STRING)
  13. @DiscriminatorValue("person")
  14. public class Person {
  15. private int id;
  16. private String name;
  17. @Id
  18. @GeneratedValue
  19. public int getId() {
  20. return id;
  21. }
  22. public void setId(int id) {
  23. this.id = id;
  24. }
  25. public String getName() {
  26. return name;
  27. }
  28. public void setName(String name) {
  29. this.name = name;
  30. }
  31. }

Student.java:

  1. package com.bean;
  2. import javax.persistence.DiscriminatorValue;
  3. import javax.persistence.Entity;
  4. @Entity
  5. @DiscriminatorValue("student")
  6. public class Student extends Person {
  7. private String num;
  8. public String getNum() {
  9. return num;
  10. }
  11. public void setNum(String num) {
  12. this.num = num;
  13. }
  14. }

Teacher.java:

  1. package com.bean;
  2. import javax.persistence.DiscriminatorValue;
  3. import javax.persistence.Entity;
  4. @Entity
  5. @DiscriminatorValue("teacher")
  6. public class Teacher extends Person {
  7. private String title;
  8. public String getTitle() {
  9. return title;
  10. }
  11. public void setTitle(String title) {
  12. this.title = title;
  13. }
  14. }

-—————————————————————————————————————————————

三、(TABLE_PER_CLASS)

Center 2

Person.java:

  1. package com.bean;
  2. import javax.persistence.DiscriminatorColumn;
  3. import javax.persistence.DiscriminatorType;
  4. import javax.persistence.DiscriminatorValue;
  5. import javax.persistence.Entity;
  6. import javax.persistence.GeneratedValue;
  7. import javax.persistence.GenerationType;
  8. import javax.persistence.Id;
  9. import javax.persistence.Inheritance;
  10. import javax.persistence.InheritanceType;
  11. import javax.persistence.TableGenerator;
  12. @Entity
  13. @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
  14. @TableGenerator(
  15. name="person",
  16. table="GEN_PERSON",
  17. pkColumnName="P_key",
  18. valueColumnName="P_value",
  19. pkColumnValue="person_pk",
  20. initialValue=1,
  21. allocationSize=1
  22. )
  23. public class Person {
  24. private int id;
  25. private String name;
  26. @Id
  27. @GeneratedValue(strategy=GenerationType.TABLE,generator="person")
  28. public int getId() {
  29. return id;
  30. }
  31. public void setId(int id) {
  32. this.id = id;
  33. }
  34. public String getName() {
  35. return name;
  36. }
  37. public void setName(String name) {
  38. this.name = name;
  39. }
  40. }

Student.java:

  1. package com.bean;
  2. import javax.persistence.DiscriminatorValue;
  3. import javax.persistence.Entity;
  4. @Entity
  5. public class Student extends Person {
  6. private String num;
  7. public String getNum() {
  8. return num;
  9. }
  10. public void setNum(String num) {
  11. this.num = num;
  12. }
  13. }

Teacher.java:

  1. package com.bean;
  2. import javax.persistence.DiscriminatorValue;
  3. import javax.persistence.Entity;
  4. @Entity
  5. public class Teacher extends Person {
  6. private String title;
  7. public String getTitle() {
  8. return title;
  9. }
  10. public void setTitle(String title) {
  11. this.title = title;
  12. }
  13. }

发表评论

表情:
评论列表 (有 0 条评论,103人围观)

还没有评论,来说两句吧...

相关阅读