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

news2024/11/21 2:30:47

sessionFactory

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

plugins {
    id("java")
}
group = "com.atai.hibernatespy"
version = "1.0-SNAPSHOT"
repositories {
    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?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.coloradmin.cn/o/1137605.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【UE】抓取物体

目录 效果 步骤 一、制作准心 二、简单的第三人称视角偏移 三、基于屏幕正中央的打点与射线 四、物理抓取的实现&#xff08;抓取、放下、丢出&#xff09; 效果 步骤 一、制作准心 1. 新建一个HUD&#xff0c;这里命名为“HUD_ZhunXin”&#xff0c;同时复制一个第三人…

51单片机晶体管数字编码

51单片机 单片机型号&#xff1a;STC86C52RC/LE52RC 晶体管 数字编码 数字P0P1P2P3P4P5P6P7011111100101100000211011010311110010401100110510110110610111110711100000811111110911110110 00011 11110x3F10000 01100x0620101 10110x5B30100 11110x4F40110 01100x6650110 110…

Qt设计一个自定义的登录框窗口

今天写了一个Qt登录、注册的小demo&#xff0c;后续完善会连接MySQL使用&#xff0c;过几天写完我会放在github上。 主要页面&#xff1a; 动态演示&#xff1a; 写完这个界面后&#xff0c;我终于知道了Qt为什么几乎没什么好看的窗口设计了&#xff0c;随便写一个简单大方的登…

【OpenCV实现平滑图像处理】

文章目录 概要2D 卷积&#xff08;图像过滤&#xff09;模糊图像&#xff08;平滑图像&#xff09;中值模糊双边过滤小结 概要 在图像处理中&#xff0c;低通滤波器是一种常用的技术&#xff0c;用于平滑、模糊或降低图像的噪音。这种滤波器通过去除图像中高频部分&#xff08…

基于FPGA的电风扇控制器verilog,视频/代码

名称&#xff1a;基于FPGA的电风扇控制器verilog 软件&#xff1a;QuartusII 语言&#xff1a;Verilog 代码功能&#xff1a; 基于FPGA的电风扇控制器 运用 EDA SOPO实验开发系统设计一个基于FPGA的电风扇定时开关控制器,能实现手动和自动模式之间的切换。要求: (1)KI为电…

PLM如何与MES管理系统协同工作

产品生命周期管理&#xff08;PLM&#xff09;和MES生产管理系统是现代企业中不可或缺的生产管理工具。它们分别负责产品的设计和制造过程&#xff0c;对于提高企业的生产效率和产品质量具有重要作用。然而&#xff0c;要实现高效的生产管理&#xff0c;PLM和MES需要进行协同工…

Python---练习:使用for循环嵌套实现打印九九乘法表

思考&#xff1a; 外层循环主要用于控制循环的行数&#xff0c;内层循环用于控制列数。 基本语法&#xff1a; # 外层循环 for i in 序列1:# 内层循环for j in 序列2:循环体 序列1 序列2 &#xff0c;就可以是range(1, 10) -----也就是从1&#xff0c;到9。 参考while循环…

笔记43:ResNet 结构详解

笔记本地地址&#xff1a;D:\work_file\DeepLearning_Learning\03_个人笔记\2.图像处理任务\ResNet网络学习 a a a a a a a a a a a a a a a a a a a a a a a a a a a a a

DTO、VO、BO、PO等各种XO汇总

贫血模型和富领域模型 1.POJO对象(Plain Old Java Object) Plain Old Java Object(POJO)&#xff0c;它的本来含义是指一个常规的、不受任何框架、平台的约束和限制的Java对象。可以认为&#xff0c;如果一个模块定义的对象皆为POJO&#xff0c;那么除了依赖JDK&#xff0c;它…

聚团队之力,学领军之道——麒麟信安组织开展卓越领导力主题培训

为提升高层次管理人员的领导力水平&#xff0c;为企业上市后高速发展以及高效运营提供更好支撑&#xff0c;日前&#xff0c;麒麟信安组织开展卓越领导力主题培训&#xff0c;公司领导层、各部门负责人以及各项目、技术骨干共同参加。 麒麟信安总裁刘文清作开训致辞。刘总指出&…

Python---练习:使用for循环实现用户名+密码认证

案例&#xff1a; 用for循环实现用户登录 ① 输入用户名和密码 ② 判断用户名和密码是否正确&#xff08;usernamelaowang&#xff0c;passwordlw123&#xff09; ③ 登录仅有三次机会&#xff0c;超过3次会报错 思考&#xff1a; 用户登陆情况有3种: ① 用户名错误(此时…

Ctrl+Alt+L或Ctrl+Alt+M或Ctrl+Alt+S热键无法启用(华硕天选)与armoury creat冲突

其实就是冲突了&#xff0c;但是就是检测不到&#xff08;spy测不到&#xff0c;其他哪个open啥啥啥的直接进不去内核模式&#xff09;。然后去找了个按键检测&#xff0c;发现都是找不到按键按下的事件&#xff0c;能检测到按键抬起事件&#xff0c;判断要么是应用占用&#x…

常见面试题-MySQL专栏(一)

为什么 mysql 删了行记录&#xff0c;反而磁盘空间没有减少&#xff1f; 答&#xff1a; 在 mysql 中&#xff0c;当使用 delete 删除数据时&#xff0c;mysql 会将删除的数据标记为已删除&#xff0c;但是并不去磁盘上真正进行删除&#xff0c;而是在需要使用这片存储空间时&…

vue源码分析(二)——vue的入口发生了什么

文章目录 前言&#xff08;1&#xff09;vue 项目构建的时候&#xff0c;通过package.json文件看到构建入口&#xff08;2&#xff09; 构建入口页面&#xff1a;导入同级模块config的getAllbuilds方法&#xff08;3&#xff09; 通过传入参数中的builds对象使用map获取&#x…

Python---for循环嵌套

for循环嵌套&#xff0c;就是一个for循环里面嵌套另外一个for循环的写法。 当循环结构相互嵌套时&#xff0c;位于外层的循环结构常简称为外层循环或外循环&#xff0c;位于内层的循环结构常简称为内层循环或内循环。 基本语法&#xff1a; # 外层循环 for i in 序列1:# 内层…

Typecho 添加 Emoji 表情报错「解决方案」

Typecho 添加 Emoji 表情报错 文章目录 Typecho 添加 Emoji 表情报错前言Emoji 表情utf8mb4 与 UTF8 解决方案[1] 数据库编码更改[2] 数据库配置文件更改 前言 Typecho 添加 Emoji 表情不支持&#xff0c;报错 Database Query Error Emoji 表情 Emoji 就是表情符号&#xff0c…

VMware Workstation提示:另一个程序已锁定文件的一部分,进程无法访问,删除.lck文件夹和文件

一、如图 二、原因 因为虚拟机在运行的时候&#xff0c;会锁定文件&#xff0c;防止被修改&#xff0c;而如果系统突然崩溃&#xff0c;虚拟机就来不急把已锁定的文件解锁。当你再次启动虚拟机的时候&#xff0c;会提示这类错误信息。 三、解决 进入虚拟机文件夹&#xff0c;…

node模块导出引入两种方式和npm包管理

模块化的好处 在 Node.js 中每个文件都被当做是一个独立的模块&#xff0c;模块内定义的变量和函数都是独立作用域的&#xff0c;因为 Node.js 在执行模块代码时&#xff0c;将使用如下所示的函数封装器对其进行封装 (function(exports,require,module,__filename,_dirname){//…

JavaScript-2-菜鸟教程

字符串 可以使用 索引 位置访问字符串中的每个字符 可以使用内置属性 length 来计算字符串的长度 var txt "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; var sln txt.length;<script>var x "John"; // x是一个字符串// 使用 new 关键字将字符…

p5.js 变换操作

本文简介 带尬猴&#xff0c;我嗨德育处主任 在 canvas 里&#xff0c;变换是基础功能。很多基于 canvas 封装的库都有这功能&#xff0c;比如 《Fabric.js 变换视窗》。 变换是针对画布进行全局调整的一种能力&#xff0c;它可以对画布进行全局移动、缩放、旋转等操作。 p5…