休眠 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;
            }
        }

        ...
    }