hibernate源码(1)--- schema创建

sessionFactory

配置项:
image.png
hibernate的核心是sessionFactory,那我们看看如何构建session Factory。
参考官网:

plugins {id("java")
}
group = "com.atai.hibernatespy"
version = "1.0-SNAPSHOT"
repositories {mavenCentral()
}
dependencies {// the GOAT ORMimplementation("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 schemasessionFactory.getSchemaManager().exportMappedObjects(true);// persist an entitysessionFactory.inTransaction(session -> {session.persist(new Book("9781932394153", "Hibernate in Action"));});// query data using HQLsessionFactory.inSession(session -> {out.println(session.createSelectionQuery(" select isbn||': '||title from Book").getSingleResult());});// query data using criteria APIsessionFactory.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, ";");// 是否展示SQLp.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.getMap settings = registry.getService(ConfigurationService.class).getSettings();MetadataSources metadataSources = new MetadataSources(registry);entities.forEach(new Consumer<EntityType<?>>() {@Overridepublic 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?useOldAliasMetadataBehavior=true&serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8&useSSL=false&nullCatalogMeansCurrent=true");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);

实际操作的也就是下面的几个类:
image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/171300.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Latex笔记

目录 1. Section 编号方式(数字、字母、罗马)&计数器计数形式修改 3.一些常用的数学符号 4. 范数 5. 数学符号对照表 1. Section 编号方式(数字、字母、罗马)&计数器计数形式修改 IEEE模板中Section的编号是罗马数字&#xff0c;要是改投其他刊物的话可能得用阿拉…

毅速丨增减材协同制造已逐渐成为趋势

近年来&#xff0c;增材制造3D打印技术的发展非常迅速&#xff0c;被广泛应用于航空航天、汽车、电子、医疗等许多行业。增材制造技术通过逐层增加材料的方式制造出各种复杂形状的零件&#xff0c;具有很高的制造效率和灵活性。 然而&#xff0c;在精密加工领域&#xff0c;增材…

『力扣刷题本』:合并两个有序链表(递归解法)

一、题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]示例 2&#xff1a; 输入&#xff1a;l1 [], l2 [] 输出&#x…

myTracks for Mac:GPS轨迹记录器的强大与便捷

你是否曾经在户外活动或旅行中&#xff0c;希望能够记录下你的移动轨迹&#xff1f;或者在工作中&#xff0c;需要跟踪你的行程路线&#xff1f;myTracks for Mac 是一款强大的 GPS 轨迹记录器&#xff0c;它可以帮助你实现这些愿望。 myTracks 是一款专门为 Mac 设计的 GPS 轨…

Linux环境开发工具yum、makefile的使用 【Linux】

文章目录 Linux软件包管理器 - yumLinux下安装软件的方式yum查找软件包如何实现本地机器和云服务器之间的文件互传卸载软件Linux编译器 - gcc/g 程序的翻译过程1.预编译&#xff08;预处理&#xff09;2.编译&#xff08;生成汇编&#xff09;3.汇编&#xff08;生成机器可识别…

多测师肖sir_高级金牌讲师__接口测试之tonken (5.6)

接口测试之tonken 网站&#xff1a;http://shop.duoceshi.com/login?redirect2Fdashboard 第一个接口&#xff1a;uiid接口 uiid接口url&#xff1a;http://manage.duoceshi.com/auth/code test中语句&#xff1a; var jsonData JSON.parse(responseBody); postman.setEnvi…

Java集成腾讯云OCR身份证识别接口

一、背景 项目用到身份证识别获取人员信息的功能&#xff0c;于是想到了腾讯云提供这样的API。在整合代码过程都很顺利&#xff0c;利用腾讯云官方SDK很快集成进来。但是在上测试环境部署时有了新的问题&#xff0c;通过Nginx代理后的环境无法访问到目标腾讯云接口&#xff0c;…

Node学习笔记之MongoDB

一、简介 1.1 Mongodb 是什么 MongoDB 是一个基于分布式文件存储的数据库&#xff0c;官方地址 MongoDB: The Developer Data Platform | MongoDB 1.2 为什么选择 Mongodb 操作语法与 JavaScript 类似&#xff0c;容易上手&#xff0c;学习成本低 二、核心概念 Mongodb 中…

中国两轮“技术派”绿源,为全球电动市场带来跨越式方案

历史越长的行业&#xff0c;遇到变革之时&#xff0c;需要经历的考验、做出的突破就越多。两轮电动车&#xff0c;这个非常本土化的赛道&#xff0c;就是如此。 中国是两轮电动车产销大国&#xff0c;自上世纪晚期开始&#xff0c;中国两轮电动车迅速发展&#xff0c;绿源等一…

LeetCode 740.删除并获得点数---->打家劫舍

前言&#xff1a;简单写写自己对这道题的拙见&#xff0c;如有意见或者建议可以联系笔者owo 首先&#xff0c;看看完整题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;你可以对它进行一些操作。 每次操作中&#xff0c;选择任意一个 nums[i] &#xff0c;删除它并获…

【数据结构】模拟实现栈和队列

文章目录 栈&#xff08;Stack&#xff09;栈的概念栈的常用方法模拟实现栈 队列&#xff08;Queue&#xff09;队列的概念队列的常用方法队列的模拟实现循环队列模拟实现 栈&#xff08;Stack&#xff09; 栈的概念 栈是一种特殊的线性表&#xff0c;只允许在固定的一端进行…

网盘限速问题解析:哪家网盘真的不限速?

天下苦网盘限速久矣。市面上一些网盘工具要不然是收费限流&#xff0c;要不然是需要额外购买下载券。哪家网盘真的不限速&#xff1f; Zoho Workdrive 企业网盘是真正的不限速网盘&#xff0c;上传和下载文件都不限速&#xff0c;真正做到用户的网速有多快&#xff0c;下载就有…

Android笔记(八):基于CameraX库结合Compose和传统视图组件PreviewView实现照相机画面预览和照相功能

CameraX是JetPack库之一&#xff0c;通过CameraX可以向应用增加相机的功能。在下列内容中&#xff0c;将介绍一个结合CameraX实现一个简单的拍照应用。本应用必须采用Android SDK 34。并通过该简单示例&#xff0c;了解传统View层次组件的UI组件如何与Compose组件结合实现移动应…

大数据-Storm流式框架(三)--Storm搭建教程

一、两种搭建方式 1、storm单节点搭建 2、完全分布式搭建 二、storm单节点搭建 准备 下载地址&#xff1a;Index of /dist/storm 1、环境准备&#xff1a; Java 6 Python 2.6.6 2、上传、解压安装包 3、在storm目录中创建logs目录 mkdir logs 启动 ./storm help …

是谁在造谣杭州取消直播带货?

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 这个世道&#xff0c;谣言的传播成本很低&#xff1a;比如“杭州禁止直播带货”这件事。 就在今天若水跟我说&#xff1a;“杭州禁止直播是谣言了&#xff0c;辟谣了”让我也赶紧隐藏或删除内容&…

Linux - 进程的优先级 和 如何使用优先级调度进程

理解linux 当中如何做到 把一个PCB 放到多个 数据结构当中 在Linux 当中&#xff0c;一个进程的 PCB 不会仅仅值存在一个 数据结构当中&#xff0c;他既可以在 某一个队列当中&#xff0c;又可以在 一个 多叉树当中。 队列比如 cpu 的 运行队列&#xff0c;键盘的阻塞队列等等…

C# Socket通信从入门到精通(4)——多个异步TCP客户端C#代码实现

前言: 在之前的文章C# Socket通信从入门到精通(3)——单个异步TCP客户端C#代码实现我介绍了单个异步Tcp客户端的c#代码实现,但是有的时候,我们需要连接多个服务器,并且对于每个服务器,我们都有一些比如异步连接、异步发送、异步接收的操作,那么这时候我们使用之前单个…

JAVA实现生活废品回收系统 开源

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容三、界面展示3.1 登录注册3.2 资源类型&资源品类模块3.3 回收机构模块3.4 资源求购/出售/交易单模块3.5 客服咨询模块 四、免责说明 一、摘要 1.1 项目介绍 生活废品回收系统是可持续发展的解决方案&#xff0c;旨在鼓…

LVS集群-DR模式

概念&#xff1a; LVS-DR模式&#xff0c;也是最常用的lVS负载方式&#xff0c;DR DIRECT ROUTING 直接路由模式 负载均衡器lVS调度器&#xff0c;只负责请求和转发到后端的真实服务器&#xff0c;但是影响结果&#xff0c;由后端服务器直接转发给客户端&#xff0c;不需要经…

NTRU 加密方案

参考文献&#xff1a; [Rivest97] Rivest R L. All-or-nothing encryption and the package transform[C]//Fast Software Encryption: 4th International Workshop, FSE’97 Haifa, Israel, January 20–22 1997 Proceedings 4. Springer Berlin Heidelberg, 1997: 210-218.[…