跳转至

Hibernate-JPA框架支持

Hibernate JPA框架支持

本文档描述了 SeaboxSQL 数据库对于hibernate-JPA框架的支持情况和配置说明,面向所有使用SeaboxSQL数据库的用户,主要是数据库管理员和应用程序开发人员。

有关 Hibernate 的更多信息,请参阅以下资源: Documentation - 5.6 - Hibernate ORM

  • 注意:

$SD_HOME:SeaboxSQL数据库的安装路径。

Hibernate-JPA 简介

JPA Java Persistence API,是EJB3规范中负责对象持久化的应用程序编程接口(ORM接口),它定义一系列的注释。这些注释大体可分为:类级别注释、方法级别注释、字段级别注释。给实体类添加适当的注释可以在程序运行时告诉Hibernate如何将一个实体类保存到数据库中以及如何将数据以对象的形式从数据库中读取出来。

Hibernate-JPA 驱动包和方言包

SeaboxSQL 提供了 Hibernate-JPA 的方言包dialect-1.0.0.jar来支持Hibernate-JPA,使用时将 dialect-1.0.0.jar 导入到项目的 Libraries 中并定义相关配置项即可。 JDBC驱动包seaboxsql-jdbc-xxx.jar可以从公司获取,使用时将hibernate-JPA包和 JDBC包导入到项目的Libraries中并定义相关配置项即可。

Hibernate-JPA 开发说明

使用JPA可以省去配置每个实体类的.xml 文件,只需直接在实体类中用注解的方式直接说明即可。先在META-INF文件下创建persistence.xml配置文件,如下图所示:

项目示例

Hibernate-JPA 环境配置

本部分描述如何配置 Hibernate-JPA 的开发环境,包括工程搭建、配置文件、配置方法和参数。

Hibernate-JPA 工程搭建

要使用 Hibernate-JAP进行开发,需要先搭建环境。以下两种方法均可完成搭建环境: • 创建好项目之后,在/lib 目录下导入 hibernate-JPA 的核心 jar 包以及 dialect-1.0.0.jar 方言包。 • 使用 Maven 工具来管理 jar 包,修改 pom.xml 配置来导入 hibernate-JPA 核心 jar 包以及 dialect-1.0.0.jar方言包

Hibernate-JPA 的配置文件说明

vim persistence.xml,根据环境修改文件内容:

<property name="hibernate.dialect" value="com.seabox.hibernate.SeaboxSQLDialect"/>
服务的配置方法和参数说明

Hibernate-JPA 配置文件示例(persistence.xml)

配置时按照实际使用情况修改”dialect” 、”connection.driver_class” 等参数。

说明:jdbc:seaboxsql://ip1:7300,ip2:7301/库名?targetServerType=any&loadBalanceHosts=true为SeaboxSQL连接高可用写法,该用户为sql任务轮询访问数据库不同的管理接口达到任务数量上的负载均衡。支持其中一个ip失效后只访问另一个ip,达到高可用的目的。

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
<persistence-unit name="TestJPA" transaction-type="RESOURCE_LOCAL">

        <!-- JAP实现的提供者
        1.如果只有一个提供者,可以不写 -->
        <provider>org.hibernate.ejb.HibernatePersistence</provider>

        <class>com.seabox.bean.User</class>

        <properties>

            <!-- 数据库连接 -->
            <property name="javax.persistence.jdbc.url" value="jdbc:seaboxsql://192.168.2.168:7300/seaboxsql"/>
            <property name="javax.persistence.jdbc.user" value="mppadmin"/>
            <property name="javax.persistence.jdbc.password" value="mppadmin"/>
            <property name="javax.persistence.jdbc.driver" value="com.seaboxsql.Driver"/>

            <!-- JPA提供者的配置 -->
            <!-- 数据库方言 -->
            <property name="hibernate.dialect" value="com.seabox.hibernate.SeaboxSQLDialect"/>
            <!-- sql语句/调试 -->
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.format_sql" value="true" />
             <!--  自动建表(正向工程)方式 -->
            <property name="hibernate.hbm2ddl.auto" value="update" />

        </properties>

    </persistence-unit>
</persistence>

hibernate-JPA 程序示例

Hibernate-JPA 的 java 对象示例
**
 * @Entity :指定当前类是实体类
 * @Table 实体类和表之间的对应关系
 *      name属性指定数据库中表的名称
 */
@Entity
@Table
public class UserJpa {
  
    @Id
    @GeneratedValue(generator="increment")
    @GenericGenerator(name="increment", strategy = "increment")
    private  Integer id;

    @Column
    private String description;

    public Integer getId() {
        return id;
    }

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

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    @Override
    public String toString() {
        return "Address{" +
                "id=" + id +
                ", description='" + description + '\'' +
                '}';
    }
}
Hibernate-JPA 的 java 使用示例

下例为 Hibernate 的 Java 使用示例:

public class App 
{
    public static void main( String[] args )
    {
	    
	    try {
	        EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("TestJPA");
	        //通过实体管理器工厂获取实体管理器
	        EntityManager entityManager = entityManagerFactory.createEntityManager();
	        //获取事务对象,开启事务
	        EntityTransaction entityTransaction = entityManager.getTransaction();
	        entityTransaction.begin();
	        //完成增删改查操作
	        UserJpa u1 = new UserJpa();
	        u1.setDescription("中国");
	        entityManager.persist(u1);//保存
	        //提交事务或者事务回滚
	        entityTransaction.commit();
	        //释放资源
	        entityManager.close();
	        entityManagerFactory.close();
	    }
	    catch (Exception e) {
            e.printStackTrace();
            return;
        }
 
    }  
}

Hibernate-JPA 注意点

1.HQL(JPA QL)不支持 SeaboxSQL特有的函数,包括:TO_HEX、SETSEED、STRPOS、GET_BIT、GET_BYTE、SET_BIT、SET_BYTE、EMPTY_BLOB、EMPTY_CLOB、CAST、AR-RAY_NDIMS、ARRAY_FILL、UNNEST 和 ARRAY_LENGTH 等。

2.HQL(JPA QL)不支持某些操作符,包括:+、^、%、&、|、||、#~等,以及 UNION、UNION ALL、 INTERSECT、EXCEPT。

3.不支持 INTERVAL 数据类型以及返回值为 INTERVAL 的系统函数,包括:AGE、DATE_FORMAT、ISFI-NITE、STR_VALID 和 TIMEOFDAY。

4.对于近义的系统函数,只支持常用的名称,例如:sqrt(dsqrt)cbrt(dcbrt)等。

5.对于重载的系统函数,只支持常用的参数及返回值类型,例如:LEFT(expr1 TEXT, expr2 INTEGER)REPLICATE(expr1 TEXT, expr2 INTEGER)RIGHT(expr1 TEXT, expr2 INTEGER)SUB-STRING(expr1 TEXT, [FROM] expr2 INTEGER[,[FOR] expr3 INTEGER]) 等。

6.使用原生查询时,某些函数的返回值与 SeaboxSQL有差异,例如:SIGN() 应返回整型值但实际返回浮点型。

7.只有在查询时才可使用 Query.getSingleResult() 方法,例如因为该方法会添加 Limit 子句,call function() 执行 函数取返回值时使用该方法会构造一个不合法的 SQL 语句。