• 如何程序化的构造Hibernate配置 // How to initialize Hibernate programmably


    Java为什么被人诟病,因为一切都是过度设计。Hibernate其实就是实现了一套JPA的ORM,不过用极度冗赘的配置方式,nodejs Sequelize.js,甚至Python SQLAlchemy,都比Java的实现优雅的多。当然这个是历史问题了,就没必要抱怨了。

    许多时候,我们不需要用hibernate.cfg.xml,并没有程序化的简单可控。

    下面开始实战。

    假设使用了Maven系统,首先确认hibernate-core已经作为依赖添加到pom.xml。

            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-core</artifactId>
                <version>5.2.16.Final</version>
            </dependency>

    下面添加一个User类作为范例。

    package com.jcube.mies.admin;
    
    import java.util.UUID;
    
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.Table;
    
    @Entity
    @Table(name = "User")
    public class User {
    
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        @Column(name = "id", unique = true, nullable = false)
        private Long id;
    
        @Column(name = "uuid", length = 32, unique = true, nullable = false)
        private UUID uuid;
    
        @Column(name = "name", length = 32, unique = true, nullable = false)
        private String name;
    
        public User() {
            uuid = UUID.randomUUID();
        }
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public UUID getUuid() {
            return uuid;
        }
    
        public void setUuid(UUID uuid) {
            this.uuid = uuid;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }

    对于Annoataion的用法,可以参考JPA和Hibernate的文档。

    这里用于示范的User类有3个成员变量,分别是id,这个是数据库的主键;然后还有个uuid,使用的是Java的UUID类型,全局唯一标示符;还有个name,一个字符串,代表名字。

    其实通过这个类,已经足够让Hibernate生成数据表了。

    下面程序化的构造SessionFactory,这个算是Hibernate的基本API接口。

    package com.sample;
    
    public class Launcher {
    
        private static SessionFactory sessionFactory = null;
    
        public static void main(String[] args) {
    
            // Create the session factory.
            try {
                Configuration cfg = new Configuration();
                cfg.setProperty("hibernate.show_sql", "true");
                cfg.setProperty("hibernate.format_sql", "true");
                cfg.setProperty("hibernate.use_sql_comments", "true");
                cfg.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
                cfg.setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver");
                cfg.setProperty("hibernate.connection.url", "jdbc:mysql://localhost:3306/testdb");
                cfg.setProperty("hibernate.connection.username", "testuser");
                cfg.setProperty("hibernate.connection.password", "testpwd");
                cfg.setProperty("hibernate.hbm2ddl.auto", "create");
    cfg.addAnnotatedClass(User.
    class); StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings(cfg.getProperties()); sessionFactory = cfg.buildSessionFactory(builder.build()); } catch (Exception e) { e.printStackTrace(); System.exit(1); } }

    一堆的setProperty()配置。

    hibernate.show_sql,
    hibernate.format_sql
    use_sql_comments

    这里设置为true,用户调试输出。

    然后用户配置数据库,包括地址,用户名密码等等。

    最后直接调用addAnnotatedClass(),用来直接告诉Hibernate配置,我们需要映射这个类。

    完毕。

  • 相关阅读:
    OS-TEP: Fetch-And-Add
    ULK --- Chap 4: Tasklets (Note)
    ULK --- Chap 4: ksoftirqd kernel threads (Note)
    ULK --- Chap 4: Softirqs and Tasklets (Note)
    ULK --- Chap 4: Nested Execution of Exception and Interrupt Handlers
    ULK --- Chap 4: Interrupt Descriptor Table
    己所欲,勿施于人 --- 周国平
    善良 丰富 高贵 --- 周国平
    第一重要的是做人 --- 周国平
    Operating System: Three Easy Pieces --- Load-Linked and Store-Conditional (Note)
  • 原文地址:https://www.cnblogs.com/Jedimaster/p/8746283.html
Copyright © 2020-2023  润新知