600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 5 Hibernate:Java Persistence API (JPA) 入门

5 Hibernate:Java Persistence API (JPA) 入门

时间:2023-05-31 01:35:17

相关推荐

5 Hibernate:Java Persistence API (JPA) 入门

Java Persistence API (JPA),Java 持久层 API,是 JCP 组织发布的 Java EE 标准规范,通过注解或 XML 描述实体对象和数据库表的映射关系。

Hibernate 实现了 JPA 规范,以下展示 Hibernate JPA 开发的完整步骤:

(1) 使用 Maven 管理 Hibernate 依赖

参看 4 Hibernate:使用注解(Annotation)

(2) 创建 JPA 配置文件persistence.xml

Hibernate JPA 开发不需要创建 Hibernate 特定配置文件hibernate.cfg.xml,取而代之的是创建 JPA 自有配置文件persistence.xml,JPA 规范定义的启动过程不同于 Hibernate 启动过程。

JPA 配置文件persistence.xml需要放在类路径下META-INF目录中,内容如下

<persistence xmlns="/xml/ns/persistence"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/persistence /xml/ns/persistence/persistence_2_0.xsd"version="2.0"><persistence-unit name="hibernate.jpa"><description>Persistence unit for the JPA tutorial of the Hibernate Getting Started Guide</description><class>hibernate.Person</class><properties><property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /><property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/test" /><property name="javax.persistence.jdbc.user" value="root" /><property name="javax.persistence.jdbc.password" value="123456" /><property name="hibernate.show_sql" value="true" /><property name="hibernate.hbm2ddl.auto" value="create" /></properties></persistence-unit></persistence>

注意:

需要为persistence-unit设置name属性,此名称唯一;

对比hibernate.cfg.xml,除数据库连接配置部分属性名称有所不同,其他配置保持一致。

(3) 使用注解创建持久化类

package hibernate;import java.util.Date;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.Table;import javax.persistence.Temporal;import javax.persistence.TemporalType;import org.hibernate.annotations.GenericGenerator;@Entity@Table(name = "person")public class Person {private int id;private String account;private String name;private Date birth;public Person() {}public Person(String account, String name, Date birth) {this.account = account;this.name = name;this.birth = birth;}@Id // 实体唯一标识@GeneratedValue(generator = "increment") // 使用名为“increment”的生成器@GenericGenerator(name = "increment", strategy = "increment") // 定义名为“increment”的生成器,使用Hibernate的"increment"生成策略,即自增public int getId() {return id;}public void setId(int id) {this.id = id;}public String getAccount() {return account;}public void setAccount(String account) {this.account = account;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Temporal(TemporalType.TIMESTAMP)public Date getBirth() {return birth;}public void setBirth(Date birth) {this.birth = birth;}@Overridepublic String toString() {return "Person [id=" + id + ", account=" + account + ", name=" + name + ", birth=" + birth + "]";}}

(4) 通过 JPA API 编写访问数据库的代码

package hibernate;import java.text.ParseException;import java.util.Date;import java.util.List;import javax.persistence.EntityManager;import javax.persistence.EntityManagerFactory;import javax.persistence.Persistence;import org.junit.After;import org.junit.Before;import org.junit.Test;public class EntityManagerIllustrationTest {private EntityManagerFactory entityManagerFactory;@Beforepublic void setUp() throws Exception {entityManagerFactory = Persistence.createEntityManagerFactory("hibernate.jpa");}@Afterpublic void tearDown() throws Exception {entityManagerFactory.close();}@Testpublic void test() throws ParseException {EntityManager entityManager = entityManagerFactory.createEntityManager();entityManager.getTransaction().begin();entityManager.persist(new Person("tony", "Tony Stark", new Date()));entityManager.persist(new Person("hulk", "Bruce Banner", new Date()));entityManager.getTransaction().commit();entityManager.close();entityManager = entityManagerFactory.createEntityManager();entityManager.getTransaction().begin();List<Person> result = entityManager.createQuery("FROM Person", Person.class).getResultList();for (Person person : result) {System.out.println(person);}entityManager.getTransaction().commit();entityManager.close();}}

单元测试日志:

六月 26, 12:01:22 上午 org.hibernate.jpa.internal.util.LogHelper logPersistenceUnitInformationINFO: HHH000204: Processing PersistenceUnitInfo [name: hibernate.jpa...]六月 26, 12:01:23 上午 org.hibernate.Version logVersionINFO: HHH000412: Hibernate Core {5.2.10.Final}六月 26, 12:01:23 上午 org.hibernate.cfg.Environment <clinit>INFO: HHH000206: hibernate.properties not found六月 26, 12:01:23 上午 org.mon.reflection.java.JavaReflectionManager <clinit>INFO: HCANN000001: Hibernate Commons Annotations {5.0.1.Final}六月 26, 12:01:23 上午 org.hibernate.boot.jaxb.internal.stax.LocalXmlResourceResolver resolveEntityWARN: HHH90000012: Recognized obsolete hibernate namespace /hibernate-mapping. Use namespace /dtd/hibernate-mapping instead. Support for obsolete DTD/XSD namespaces may be removed at any time.六月 26, 12:01:28 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configureWARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!)六月 26, 12:01:28 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreatorINFO: HHH10001005: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql://localhost:3306/test]六月 26, 12:01:28 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreatorINFO: HHH10001001: Connection properties: {user=root, password=****}六月 26, 12:01:28 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreatorINFO: HHH10001003: Autocommit mode: false六月 26, 12:01:28 上午 org.hibernate.engine.jdbc.connections.internal.PooledConnections <init>INFO: HHH000115: Hibernate connection pool size: 20 (min=1)Mon Jun 26 00:01:29 CST WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.六月 26, 12:01:30 上午 org.hibernate.dialect.Dialect <init>INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQL5DialectHibernate: drop table if exists PERSON六月 26, 12:01:32 上午 org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl getIsolatedConnectionINFO: HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@73511076] for (non-JTA) DDL execution was not in auto-commit mode; the Connection 'local transaction' will be committed and the Connection will be set into auto-commit mode.Hibernate: create table PERSON (ID integer not null auto_increment, ACCOUNT varchar(255), NAME varchar(255), BIRTH datetime, primary key (ID)) engine=MyISAM六月 26, 12:01:32 上午 org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl getIsolatedConnectionINFO: HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@42257bdd] for (non-JTA) DDL execution was not in auto-commit mode; the Connection 'local transaction' will be committed and the Connection will be set into auto-commit mode.六月 26, 12:01:33 上午 org.hibernate.tool.schema.internal.SchemaCreatorImpl applyImportSourcesINFO: HHH000476: Executing import script 'org.hibernate.tool.schema.internal.exec.ScriptSourceInputNonExistentImpl@4b629f13'Hibernate: insert into PERSON (ACCOUNT, NAME, BIRTH) values (?, ?, ?)Hibernate: insert into PERSON (ACCOUNT, NAME, BIRTH) values (?, ?, ?)六月 26, 12:01:33 上午 org.hibernate.hql.internal.QueryTranslatorFactoryInitiator initiateServiceINFO: HHH000397: Using ASTQueryTranslatorFactoryHibernate: select person0_.ID as ID1_0_, person0_.ACCOUNT as ACCOUNT2_0_, person0_.NAME as NAME3_0_, person0_.BIRTH as BIRTH4_0_ from PERSON person0_Person [id=1, account=tony, name=Tony Stark, birth=-06-26 00:01:33.0]Person [id=2, account=hulk, name=Bruce Banner, birth=-06-26 00:01:34.0]六月 26, 12:01:34 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stopINFO: HHH10001008: Cleaning up connection pool [jdbc:mysql://localhost:3306/test]

数据库查询结果:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。