我们都知道,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 |
+-----------+-------------+----------------------+
但vehicleId
和vehicleName
是Vehicle类的私有成员。
那么当在数据库中创建表时,它们如何在hibernate中继承?
答案 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中的属性列表。
因此,虽然超级私人领域通过传统方式对您来说是不可见的,但是您可以通过反射来访问它们并通过反思进行休眠。