Hibernate是一款流行的Java ORM框架,它提供了多种映射关系的继承方式,这里我们主要介绍三种实现方式。
单表继承
单表继承,即将继承关系建立在同一张表中,使用一个“discriminator”字段用于区分不同的实体子类。这种继承方式实现简单,对于表中数据量不大的情况适用。
实现方式
使用@Entity注解声明父类,使用@DiscriminatorColumn注解指定“discriminator”字段名。
@Entity
@DiscriminatorColumn(name = "type")
public class Animal {
...
}
子类继承父类,并使用@DiscriminatorValue注解指定该类对应的“discriminator”值
@Entity
@DiscriminatorValue("dog")
public class Dog extends Animal {
...
}
实例演示
在单表继承方式下,使用Hibernate保存一个Dog实例的示例代码。
Dog dog = new Dog();
dog.setName("Snoopy");
dog.setAge(5);
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tx = session.beginTransaction();
session.save(dog);
tx.commit();
session.close();
具体表继承
具体表继承,即将继承关系映射到不同的表中,每个子类对应一张表。这种继承方式支持面向对象封装性更好,可以方便进行数据库优化。
实现方式
使用@Entity注解声明父类,使用@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)注解指定继承策略为具体表
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Product {
...
}
子类继承父类,不需要声明@Inheritance注解,此时Hibernate会自动将子类对应映射到不同的表中
@Entity
public class Book extends Product {
...
}
实例演示
在具体表继承方式下,使用Hibernate保存一个Book实例的示例代码。
Book book = new Book();
book.setName("《Java编程思想》");
book.setPrice(69.9);
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tx = session.beginTransaction();
session.save(book);
tx.commit();
session.close();
继承关系表继承
继承关系表继承,即将继承关系映射到同一张表中,通过使用@ManyToOne或者@OneToOne注解来表示当前实体类所对应的父类对象。
实现方式
使用@Entity注解声明父类,使用@Inheritance(strategy = InheritanceType.JOINED)注解指定继承策略为继承关系表继承。同时使用@Id注解指定id属性,使用@JoinColumn注解指定外键约束。
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Vehicle {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
private String name;
@ManyToOne(optional = false)
@JoinColumn(name = "owner_id")
private Owner owner;
...
}
子类继承父类,并在对应的子类实体类中使用@OneToOne或者@ManyToOne注解表示当前实体类所对应的父类对象。还需要使用@PrimaryKeyJoinColumn注解指定主键外键映射关系。
@Entity
@PrimaryKeyJoinColumn(name = "id")
public class Car extends Vehicle {
...
}
实例演示
在继承关系表继承方式下,使用Hibernate保存一个Car实例的示例代码。
Owner owner = new Owner("张三");
Vehicle vehicle = new Car();
vehicle.setName("BMW");
vehicle.setOwner(owner);
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tx = session.beginTransaction();
session.save(owner);
session.save(vehicle);
tx.commit();
session.close();
以上便是三种Hibernate实体对象继承的方法的攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Hibernate实体对象继承的三种方法 - Python技术站