Hibernate 注释方式示例

2019-04-21 23:16|来源: 网路

可以使用注释创建hibernate应用程序。 有许多注释可用于创建hibernate应用程序,如@Entity@Id@Table等。

Hibernate注释基于JPA 2规范,并支持所有功能。
所有JPA注释都在javax.persistence.*包中定义。 Hibernate EntityManager实现由JPA规范定义的接口和生命周期。

使用hibernate注释的核心优点是我们不需要创建映射(*.hbm.xml)文件直接创建对象关联。 在这里,hibernate注释用于提供元数据。


使用注释创建hibernate应用程序的示例

创建具有注释的hibernate应用程序有4个步骤。分别如下 -

  • 为MySQL添加连接驱动程序的jar文件(如果数据库是MySQL)和注释

  • 创建持久化类

  • 在配置文件中添加持久化类的映射

  • 创建检索或存储持久对象的类

1. 为MySQL和注释添加jar文件

对于MySQL,您需要添加mysql-connector-java-5.1.40-bin.jar文件,以及 hibernate5的核心类库,如下所示 -

013.png


2. 创建持久化类

在这里,我们创建一个持久化类: Employee 。 并使用注释完成与数据库表:tb_employee 的映射关联。

@Entity注释将此类标记为实体。
@Table注释指定要保留此实体的数据的表名。 如果不使用@Table注释,hibernate将使用类名作为表名称bydefault
@Id注释标记此实体的标识符。
@Column注释指定此属性或字段的列的详细信息。如果未指定@Column注释,则属性名称将用作列名称bydefault

Employee.java 文件的代码如下 

package com656463;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity@Table(name = "tb_employee")
public class Employee {
    @Id
    private int id;
    private String firstName, lastName;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }}

3. 在配置文件中添加持久化类的映射

打开hibernate.cfg.xml文件,并添加如下的映射资源条目:

<mapping class="com656463.Employee"/>

现在完整的配置文件: hibernate.cfg.xml,将如下所示:

<?xml version='1.0' encoding='UTF-8'?><!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><!-- Generated by MyEclipse Hibernate Tools. --><hibernate-configuration>

    <session-factory>

        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/test</property>
        <property name="connection.username">root</property>
        <property name="connection.password">123456</property>
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="show_sql">true</property>

        <mapping class="com656463.Employee"/>

    </session-factory></hibernate-configuration>

4. 创建检索或存储持久对象的类

在这个类中,我们只是将Employee类的对象存储到数据库中。 在这里,我们使用StandardServiceRegistryBuilder类和MetadataSources类从持久化类获取映射的信息。

Test.java 测试类代码如下 -

package com656463;
import org.hibernate.*;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.*;
public class Test {
    public static void main(String[] args) {
        //Session session = new AnnotationConfiguration().configure().buildSessionFactory().openSession();
        final StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure("hibernate.cfg.xml")
                .build();
        // 2. 根据服务注册类创建一个元数据资源集,同时构建元数据并生成应用一般唯一的的session工厂
        SessionFactory sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();

        /**** 上面是配置准备,下面开始我们的数据库操作 ******/
        Session session = sessionFactory.openSession();// 从会话工厂获取一个session
        Transaction t = session.beginTransaction();

        Employee e1 = new Employee();
        e1.setId(1001);
        e1.setFirstName("Yii");
        e1.setLastName("Bai");

        Employee e2 = new Employee();
        e2.setId(1002);
        e2.setFirstName("Min");
        e2.setLastName("Su");

        session.persist(e1);
        session.persist(e2);

        t.commit();
        session.close();
        System.out.println("successfully saved");
    }}


运行上面(Test.java)示例,得到以下结果 -

... ...
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect
Hibernate: insert into tb_employee (firstName, lastName, id) values (?, ?, ?)
Hibernate: insert into tb_employee (firstName, lastName, id) values (?, ?, ?)
successfully savedShell

查看数据库表 tb_employee 中的数据,应该会看到以下结果 -

003.jpg


相关问答

更多
  • Hibernate注释问题[2023-05-27]

    @Id @GeneratedValue(generator = "system-uuid") @GenericGenerator(name = "system-uuid", strategy = "uuid") @Column(length = 32)
  • 您可以使用嵌入式数据库之一,例如JavaDB(例如Derby )。 JRE添加了对此数据库的支持。 因此,您的所有客户需求都安装了JRE。 并且您获得完整的关系数据库,无需任何安装和其他设置。 还有其他嵌入式数据库 ,如HSQLDB , SQLite You can use one of embedded db, like JavaDB (ex. Derby). Support of this database is added to JRE. So all your client need is inst ...
  • 应该是uuid2 : ... @GenericGenerator(name = "uuid", strategy = "uuid2") ... 见5.1.2.2.1。 各种附加发电机 。 It should be uuid2: ... @GenericGenerator(name = "uuid", strategy = "uuid2") ... See 5.1.2.2.1. Various additional generators.
  • liquibase-hibernate插件的当前文档位于https://github.com/liquibase/liquibase-hibernate/wiki 它可以让你比较你的hibernate模型和数据库,并创建和/或附加到更改日志,这样你就不需要手动编辑XML。 您从文档中发现了什么? The current documentation for the liquibase-hibernate plugin is at https://github.com/liquibase/liquibase-h ...
  • 如果你的系统如此动态以至于你不知道用户将要查询的表格,那么我看不到你将如何将这些表格映射到相应的POJO。 Hibernate的主要重点是将模式中的表映射到Java应用程序中的对象,主要通过Hibernate查询语言(HQL)或可用的其中一种程序化API。 但是,可以在hibernate中使用直接的SQL并返回非托管对象,但与使用HQL或查询API相比,它的能力受限得多。 为此,您可以使用类似于以下的代码: createSQLQuery( "SELECT * FROM someTable" ).addTra ...
  • Hibernate提供了一个JPA实现。 如果您在代码中使用纯粹的JPA,则可以在需要时自由更改为其他实现。 例如, EclipseLink / TopLink和OpenJPA是不同客户可能需要的实现。 这里有一个完整的实现列表。 如果你被迫使用hibernate提供的任何不在JPA规范中的异乎寻常的功能,你应该在你的代码库中使用特定于hibernate的API。 来自hibernate论坛的相关讨论。 Hibernate provides one of the JPA implementations. I ...
  • 如果你只使用Hibernate,那么只使用@Cache就可以了,因为@Cacheable是另一个你可以和JPA或Spring一起使用的选项。 @Cacheable通常用于JPA实体。 在文档中,它们只是指@Cache注释,所以只关注它。 这是查看Hibernate Cache Levels的一个很好的资源: http : //www.javacodegeeks.com/2012/02/hibernate-cache-levels-tutorial.html 希望这可以帮助。 尽我所能:) if you ar ...
  • 您可以使用自己的SQL来插入,更新,删除甚至从数据库中选择数据。 但对这些论点有明确的期望。 exec createPerson ?, ? exec de ...
  • 您可以为此字符串编写自己的UserType public class LowerCaseString implements UserType { //.... public void nullSafeSet(PreparedStatement preparedStatement, Object value, int index) throws HibernateException, SQLException { Hibernate. ...
  • 没有直接注释可以帮助。 您必须编写查询以获取特定日期的装置。 No direct annotation can help. You will have to write a query for fetching fixtures of particular date.