欢迎来到飞鸟慕鱼博客,开始您的技术之旅!
当前位置: 首页知识笔记正文

hibernate源码1 schema创建,源码编辑器创建五子棋

墨初 知识笔记 98阅读
sessionFactory

配置项

hibernate的核心是sessionFactory那我们看看如何构建session Factory。
参考官网

plugins {    id(java)}group  com.atai.hibernatespyversion  1.0-SNAPSHOTrepositories {    mavenCentral()}dependencies {    // the GOAT ORM    implementation(org.hibernate.orm:hibernate-core:6.3.0.Final)    // Hibernate Validator)    implementation(org.hibernate.validator:hibernate-validator:8.0.0.Final)    implementation(org.glassfish:jakarta.el:4.0.2)    // Agroal connection pool)    implementation(org.hibernate.orm:hibernate-agroal:6.3.0.Final)    implementation(io.agroal:agroal-pool:2.1)    // logging via Log4j)    implementation(org.apache.logging.log4j:log4j-core:2.20.0)    //JPA Metamodel Generator)    annotationProcessor(org.hibernate.orm:hibernate-jpamodelgen:6.3.0.Final)    runtimeOnly(com.h2database:h2:2.1.214)// Compile-time checking for HQL    //implementation org.hibernate : query-validator: 2.O-SNAPSHOT//annotationProcessor org.hibernate: query-validator: 2.O-SNAPSHOT// H2 database//    runtimeonly( com.h2database:h2:2.1.214)    testImplementation(platform(org.junit:junit-bom:5.9.1))    testImplementation(org.junit.jupiter:junit-jupiter)}tasks.test {    useJUnitPlatform()}
package org.example;import com.atai.entity.Book;import org.hibernate.cfg.Configuration;import static java.lang.Boolean.TRUE;import static java.lang.System.out;import static org.hibernate.cfg.JdbcSettings.*;import static org.hibernate.cfg.JdbcSettings.HIGHLIGHT_SQL;public class Main {    public static void main(String[] args) {        var sessionFactory  new Configuration()                .addAnnotatedClass(Book.class)                .setProperty(URL, jdbc:h2:mem:db1)                .setProperty(USER, sa)                .setProperty(PASS, )                // use Agroal connection pool                .setProperty(hibernate.agroal.maxSize, 20)//display sQL in console                .setProperty(SHOW_SQL, TRUE.toString())                .setProperty(FORMAT_SQL, TRUE.toString())                .setProperty(HIGHLIGHT_SQL, TRUE.toString()).buildSessionFactory();        // export the inferred database schema        sessionFactory.getSchemaManager().exportMappedObjects(true);        // persist an entity        sessionFactory.inTransaction(session -> {            session.persist(new Book(9781932394153, Hibernate in Action));        });        // query data using HQL        sessionFactory.inSession(session -> {            out.println(session.createSelectionQuery( select isbn||: ||title from Book).getSingleResult());        });        // query data using criteria API        sessionFactory.inSession(session -> {            var builder  sessionFactory.getCriteriaBuilder();            var query  builder.createQuery(String.class);            var book  query.from(Book.class);            query.select(builder.concat(builder.concat(book.get(isbn), builder.literal(: )), book.get(title)));            out.println(session.createSelectionQuery(query).getSingleResult());        });    }}

可以通过Configuration来进行创建参数配置在property中buildSessionFactory 创建出sf。
有了sf即可以连接数据库处理。

schema相关

前面的例子中已经有了比较好的实例通过sf的schemaManager创建

sessionFactory.getSchemaManager().exportMappedObjects(true);

public interface SchemaManager {/** * Export database objects mapped by Hibernate entities. * <p> * Programmatic way to run {link org.hibernate.tool.schema.spi.SchemaCreator}. * * param createSchemas if {code true}, attempt to create schemas, *                      otherwise, assume the schemas already exist */void exportMappedObjects(boolean createSchemas);/** * Drop database objects mapped by Hibernate entities, undoing the * {linkplain #exportMappedObjects(boolean) previous export}. * <p> * Programmatic way to run {link org.hibernate.tool.schema.spi.SchemaDropper}. * * param dropSchemas if {code true}, drop schemas, *                    otherwise, leave them be */void dropMappedObjects(boolean dropSchemas);/** * Validate that the database objects mapped by Hibernate entities * have the expected definitions. * <p> * Programmatic way to run {link org.hibernate.tool.schema.spi.SchemaValidator}. */void validateMappedObjects();/** * Truncate the database tables mapped by Hibernate entities, and * then re-import initial data from any configured * {linkplain org.hibernate.cfg.AvailableSettings#JAKARTA_HBM2DDL_LOAD_SCRIPT_SOURCE * load script}. * <p> * Programmatic way to run {link org.hibernate.tool.schema.spi.SchemaTruncator}. */void truncateMappedObjects();}

另一个与schema关系较大的类就是SchemaManagementToolCoordinator

   List<Class> classes  Arrays.asList(AccessconfigEntity.class);                Properties p  new Properties();                // 数据库方言最终输出的方言                p.put(AvailableSettings.DIALECT, MySQL5InnoDBDialect.class.getName());                // 自动执行的动作                p.put(AvailableSettings.HBM2DDL_AUTO, ddlAuto);                // 分隔符默认为空                p.put(AvailableSettings.HBM2DDL_DELIMITER, ;);                // 是否展示SQL                p.put(AvailableSettings.SHOW_SQL, true);                p.put(hibernate.connection.driver_class, dataSource.getDriverClassName());                p.put(hibernate.connection.url, urlTena);                p.put(hibernate.connection.username, dataSource.getUsername());                p.put(hibernate.connection.password, dataSource.getPassword());                // 是否使用默认的jdbc元数据默认为true读取项目自身的元数据                p.put(hibernate.temp.use_jdbc_metadata_defaults, true);//                p.put(hibernate.temp.use_jdbc_metadata_defaults, false);                ConfigurationHelper.resolvePlaceHolders(p);                ServiceRegistry registry  new StandardServiceRegistryBuilder()                        .applySettings(p)                        .build();//                registry.get                Map settings  registry.getService(ConfigurationService.class).getSettings();                MetadataSources metadataSources  new MetadataSources(registry);                entities.forEach(new Consumer<EntityType<?>>() {                    Override                    public void accept(EntityType<?> entityType) {                        metadataSources.addAnnotatedClass(entityType.getJavaType());                    }                });                classes.forEach(metadataSources::addAnnotatedClass);                Metadata metadata  metadataSources.buildMetadata();                HashMap properties  new HashMap<>();                properties.putAll(registry.getService(ConfigurationService.class).getSettings());                SchemaManagementToolCoordinator.process(metadata, registry, settings, null);

如果做代码跟踪就会发现是否使用默认的use_jdbc_metadata_defaults 配置项将会建立连接获取数据库的表信息。

SchemaExport

schemaexport是另一个与schema相关的类可以控制台输出脚本文件输出与数据库创建

        Configuration cfn  new Configuration();        cfn.setProperty(hibernate.connection.driver_class, com.mysql.jdbc.Driver);        cfn.setProperty(hibernate.connection.url, jdbc:mysql://10.110.87.204:3306/corps?useOldAliasMetadataBehaviortrue&serverTimezoneGMT+8&useUnicodetrue&characterEncodingUTF-8&useSSLfalse&nullCatalogMeansCurrenttrue);        cfn.setProperty(hibernate.connection.username, root);        cfn.setProperty(hibernate.connection.password, liugeba?68);        cfn.setProperty(hibernate.dialect, org.hibernate.dialect.MySQL5InnoDBDialect);        cfn.configure();        ServiceRegistry registry  new StandardServiceRegistryBuilder().applySettings(cfn.getProperties()).build();//        System.out.println(cfn.toString());////        ServiceRegistry registry  new StandardServiceRegistryBuilder().configure().build();//        registry.        Metadata metadata  new MetadataSources(registry).buildMetadata();        SchemaExport export  new SchemaExport();        export.create(EnumSet.of(TargetType.DATABASE), metadata);

实际操作的也就是下面的几个类

标签:
声明:无特别说明,转载请标明本文来源!