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