Building the ServiceRegistry

FIXME customClassLoader and customIntegrator 未知

implicitly built BootstrapServiceRegistry

package org.example.demo.hibernate;

import org.hibernate.boot.registry.StandardServiceRegistryBuilder;

public class Test {
    public static void main(String[] args) {
        StandardServiceRegistryBuilder standardRegistryBuilder = new StandardServiceRegistryBuilder();
        // org.hibernate.boot.registry.StandardServiceRegistryBuilder@4973813a
        System.out.println(standardRegistryBuilder);
    }
}

explicitly built BootstrapServiceRegistry

package org.example.demo.hibernate;

import org.hibernate.boot.registry.BootstrapServiceRegistry;
import org.hibernate.boot.registry.BootstrapServiceRegistryBuilder;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;

public class Test {
    public static void main(String[] args) {
        BootstrapServiceRegistry bootstrapRegistry = new BootstrapServiceRegistryBuilder().build();
        StandardServiceRegistryBuilder standardRegistryBuilder = new StandardServiceRegistryBuilder(bootstrapRegistry);
        // org.hibernate.boot.registry.StandardServiceRegistryBuilder@4973813a
        System.out.println(standardRegistryBuilder);
    }
}

两例显示的 hashcode 都是 4973813a 有点怪。多次重复运行依然是这个结果。

package org.example.demo.hibernate;

import javax.persistence.Entity;

import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.service.ServiceRegistry;

public class Test {
    public static void main(String[] args) {
        ServiceRegistry standardRegistry = new StandardServiceRegistryBuilder().build();
        MetadataSources sources = new MetadataSources(standardRegistry);
        sources.addAnnotatedClass(MyEntity.class);
        // org.hibernate.boot.MetadataSources@34cd072c
        System.out.println(sources);
    }

    @Entity
    public static class MyEntity {
    }
}

Event Listener registration

Building the Metadata

package org.example.demo.hibernate;

import javax.persistence.Entity;
import javax.persistence.Id;

import org.hibernate.boot.Metadata;
import org.hibernate.boot.MetadataBuilder;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.service.ServiceRegistry;

public class Test {
    public static void main(String[] args) {
        ServiceRegistry standardRegistry = new StandardServiceRegistryBuilder()
                .applySetting("hibernate.connection.url", "jdbc:p6spy:postgresql://localhost:5432/test")
                .applySetting("hibernate.connection.username", "postgres")
                .applySetting("hibernate.connection.password", "postgres").build();
        MetadataSources sources = new MetadataSources(standardRegistry);
        sources.addAnnotatedClass(MyEntity.class);
        MetadataBuilder metadataBuilder = sources.getMetadataBuilder();
        metadataBuilder.applyImplicitNamingStrategy(ImplicitNamingStrategyJpaCompliantImpl.INSTANCE);
        Metadata metadata = metadataBuilder.build();
        // org.hibernate.boot.internal.MetadataImpl@335b5620
        System.out.println(metadata);
    }

    @Entity
    public static class MyEntity {
        @Id
        private Long id;
    }
}

注意

  • 此时不能再使用 javax.persistence.jdbc.url, javax.persistence.jdbc.user, javax.persistence.jdbc.password 而应该改为 hibernate.connection.url, hibernate.connection.username, hibernate.connection.password
  • MyEntity 中至少要有个 @Id
  • 多次运行输出的 hashcode 一样
  • 此时运行后程序已经不自己终止了(有线程)

Building the SessionFactory

package org.example.demo.hibernate;

import javax.persistence.Entity;
import javax.persistence.Id;

import org.hibernate.SessionFactory;
import org.hibernate.boot.Metadata;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;

public class Test {
    public static void main(String[] args) {
        StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder().configure(
                "org/example/demo/hibernate/hibernate.cfg.xml").build();
        Metadata metadata = new MetadataSources(standardRegistry).addAnnotatedClass(MyEntity.class)
                .getMetadataBuilder().applyImplicitNamingStrategy(ImplicitNamingStrategyJpaCompliantImpl.INSTANCE)
                .build();
        SessionFactory sessionFactory = metadata.getSessionFactoryBuilder().build();
        // org.hibernate.internal.SessionFactoryImpl@7096b474
        System.out.println(sessionFactory);
    }

    @Entity
    public static class MyEntity {
        @Id
        private Long id;
    }
}

src/main/java/org/example/demo/hibernate/hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <property name="connection.url">jdbc:p6spy:postgresql://localhost:5432/test</property>
    <property name="connection.username">postgres</property>
    <property name="connection.password">postgres</property>
  </session-factory>
</hibernate-configuration>

在这过程中的 Builder

  • BootstrapServiceRegistryBuilder - new 得到。 build 的结果是 BootstrapServiceRegistry
  • StandardServiceRegistryBuilder - new 得到。 build 的结果是 StandardServiceRegistry
  • MetadataBuilder - MetadataSources.getMetadataBuilder() 得到。 build 结果是 Metadata
  • SessionFactoryBuilder - Metadata.getSessionFactoryBuilder() 得到。 build 的结果是 SessionFactory

results matching ""

    No results matching ""