Hibernate似乎看到了私有领域的实体

时间:2016-01-28 11:05:26

标签: java hibernate inheritance

我们都知道,private成员不是在JAVA中继承的,或者更具体地说,私有成员变量在子类中不可见。 所以,如果我有一个超级A如下:

 public class A {

      private int a;
      public int b;

 }

还有其他B类,它按如下方式扩展A:

 public class B extends A{}

现在我有以下代码段:

 class b = new B();
 System.out.println(b.a);    //  Not possible since 'a' is declared privtate
 System.out.println(b.a);    // this is possible

现在,我在hibernate教程中使用了以下代码。 (示例涉及Table_PER_CLASS策略。) 这是代码,

  public class Vehicle {
  @Id
  private int vehicleId;
  private String vehicleName;

  public String getVehicleName() {
    return vehicleName;
  }

  public void setVehicleName(String vehicleName) {
    this.vehicleName = vehicleName;
  }

  public Vehicle() {
    // TODO Auto-generated constructor stub
  }

  public int getVehicleId() {
    return vehicleId;
  }

  public void setVehicleId(int vehicleId) {
    this.vehicleId = vehicleId;
  }

}

我有一个TwoWheeler课程如下:

 @Entity
 public class TwoWheeler extends Vehicle {

 private String SteeringHandle;

  public String getSteeringHandle() {
    return SteeringHandle;
   }

   public void setSteeringHandle(String steeringHandle) {
    SteeringHandle = steeringHandle;
   }
 }

当我运行此代码时,会创建一个TwoWheeler表,其中包含以下列:

 +-----------+-------------+----------------------+
 | vehicleId | vehicleName | SteeringHandle       |
 +-----------+-------------+----------------------+
 |         2 | Bike        | Bike Steering Handle |
 +-----------+-------------+----------------------+

vehicleIdvehicleName是Vehicle类的私有成员。 那么当在数据库中创建表时,它们如何在hibernate中继承?

3 个答案:

答案 0 :(得分:0)

Hibernate使用getter和setters方法访问字段......哪些是公共的

答案 1 :(得分:0)

您的问题 - 当在数据库中创建表时,它们如何在休眠中继承? Hibernate是一个内部使用反射的orm框架。 继承或绑定在运行时完成。由于您的TwoWheeler类具有没有显式继承策略的父类,因此使用默认策略-SINGLE_TABLE。基于继承策略生成查询,生成数据库中的映射关系。

答案 2 :(得分:0)

因为您使用vehicalId注释对字段@Id进行了注释,所以hibernate推断您正在使用AccessType.FIELD并使用Java反射来读取类中的所有字段以确定实体属性的列表(这包括私人领域)。

如果您使用getVehicalId()注释id getter @Id,那么您将使用AccessType.PROPERTY,而hibernate会以相同的方式推断getter / setter中的属性列表。

因此,虽然超级私人领域通过传统方式对您来说是不可见的,但是您可以通过反射来访问它们并通过反思进行休眠。