休眠 SessionFactory 对象
hibernate SessionFactory ob
考虑 Hibernate 客户端代码
Configuration cfg = new Configuration();
cfg.configure();
此时持久化的默认构造函数class不会调用。这意味着不会为持久性创建实例 class
但在创建 SessionFactory
对象之后,即
Configuration cfg = new Configuration();
cfg.configure();
SessionFactory sf = cfg.buildSessionFactory();
default construcort 将恰好调用 3 次,所以问题是为什么在创建 SessionFactory
对象后将创建恰好 3 个持久性 class 对象。
这是一个有趣的通知。
Hibernate 通过加载和检查相应的 Class<?>
对象来获取有关映射的所有信息。但是,有时,它需要无法从 Class<?>
对象中获取的信息,例如,调用某个持久化方法的结果。在这种情况下,Hibernate 创建一个持久化的临时对象并调用它的方法。
您可以在默认构造函数上设置断点并检查Hibernate 实例化持久对象的所有情况。
我尝试使用 Hibernate 4 和 Hibernate 5 测试此行为。在这两种情况下,默认构造函数在此方法中仅调用一次,在
行中
final Serializable defaultValue = (Serializable) identifierGetter.get( instantiate( constructor ) );
/**
* Return an IdentifierValue for the specified unsaved-value. If none is specified,
* guess the unsaved value by instantiating a test instance of the class and
* reading it's id property, or if that is not possible, using the java default
* value for the type
*
* @param unsavedValue The mapping defined unsaved value
* @param identifierGetter The getter for the entity identifier attribute
* @param identifierType The mapping type for the identifier
* @param constructor The constructor for the entity
*
* @return The appropriate IdentifierValue
*/
public static IdentifierValue getUnsavedIdentifierValue(
String unsavedValue,
Getter identifierGetter,
Type identifierType,
Constructor constructor) {
if ( unsavedValue == null ) {
if ( identifierGetter != null && constructor != null ) {
// use the id value of a newly instantiated instance as the unsaved-value
final Serializable defaultValue = (Serializable) identifierGetter.get( instantiate( constructor ) );
return new IdentifierValue( defaultValue );
}
else if ( identifierGetter != null && (identifierType instanceof PrimitiveType) ) {
final Serializable defaultValue = ( (PrimitiveType) identifierType ).getDefaultValue();
return new IdentifierValue( defaultValue );
}
else {
return IdentifierValue.NULL;
}
}
...
}
考虑 Hibernate 客户端代码
Configuration cfg = new Configuration();
cfg.configure();
此时持久化的默认构造函数class不会调用。这意味着不会为持久性创建实例 class
但在创建 SessionFactory
对象之后,即
Configuration cfg = new Configuration();
cfg.configure();
SessionFactory sf = cfg.buildSessionFactory();
default construcort 将恰好调用 3 次,所以问题是为什么在创建 SessionFactory
对象后将创建恰好 3 个持久性 class 对象。
这是一个有趣的通知。
Hibernate 通过加载和检查相应的 Class<?>
对象来获取有关映射的所有信息。但是,有时,它需要无法从 Class<?>
对象中获取的信息,例如,调用某个持久化方法的结果。在这种情况下,Hibernate 创建一个持久化的临时对象并调用它的方法。
您可以在默认构造函数上设置断点并检查Hibernate 实例化持久对象的所有情况。
我尝试使用 Hibernate 4 和 Hibernate 5 测试此行为。在这两种情况下,默认构造函数在此方法中仅调用一次,在
行中final Serializable defaultValue = (Serializable) identifierGetter.get( instantiate( constructor ) );
/**
* Return an IdentifierValue for the specified unsaved-value. If none is specified,
* guess the unsaved value by instantiating a test instance of the class and
* reading it's id property, or if that is not possible, using the java default
* value for the type
*
* @param unsavedValue The mapping defined unsaved value
* @param identifierGetter The getter for the entity identifier attribute
* @param identifierType The mapping type for the identifier
* @param constructor The constructor for the entity
*
* @return The appropriate IdentifierValue
*/
public static IdentifierValue getUnsavedIdentifierValue(
String unsavedValue,
Getter identifierGetter,
Type identifierType,
Constructor constructor) {
if ( unsavedValue == null ) {
if ( identifierGetter != null && constructor != null ) {
// use the id value of a newly instantiated instance as the unsaved-value
final Serializable defaultValue = (Serializable) identifierGetter.get( instantiate( constructor ) );
return new IdentifierValue( defaultValue );
}
else if ( identifierGetter != null && (identifierType instanceof PrimitiveType) ) {
final Serializable defaultValue = ( (PrimitiveType) identifierType ).getDefaultValue();
return new IdentifierValue( defaultValue );
}
else {
return IdentifierValue.NULL;
}
}
...
}