Maven + JPA + Hibernate + Postgresql的基本配置实例

Java 一条评论

一、创建项目

使用Maven或Eclipse插件m2eclipse创建Maven项目,在pom.xml添加依赖:

<properties>
	<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	<jpa.version>1.0.1.Final</jpa.version>
	<hibernate.version>4.2.1.Final</hibernate.version>
	<postgresql.version>9.4-1201-jdbc41</postgresql.version>
	<slf4j.version>1.6.4</slf4j.version>
	<junit.version>4.11</junit.version>
</properties>

<dependencies>

	<!-- JPA API -->
	<dependency>
		<groupId>org.hibernate.javax.persistence</groupId>
		<artifactId>hibernate-jpa-2.0-api</artifactId>
		<version>${jpa.version}</version>
	</dependency>

	<!-- Hibernate JPA Support -->
	<dependency>
		<groupId>org.hibernate</groupId>
		<artifactId>hibernate-entitymanager</artifactId>
		<version>${hibernate.version}</version>
	</dependency>

	<!-- log4j -->
	<dependency>
		<groupId>org.slf4j</groupId>
		<artifactId>slf4j-log4j12</artifactId>
		<version>${slf4j.version}</version>
	</dependency>

	<!-- postgresql jdbc -->
	<dependency>
		<groupId>org.postgresql</groupId>
		<artifactId>postgresql</artifactId>
		<version>${postgresql.version}</version>
	</dependency>

	<!-- test -->
	<dependency>
		<groupId>junit</groupId>
		<artifactId>junit</artifactId>
		<version>${junit.version}</version>
		<scope>test</scope>
	</dependency>
</dependencies>

二、配置persistence.xml

在src/main/resources下创建文件夹META-INF,新建XML文件,写上配置信息:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
	xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">  
	
	<persistence-unit name="jpa-2" transaction-type="RESOURCE_LOCAL">
		<!-- 配置使用什么ORM产品作为JPA的实现
			1. 实际上配置的是接口javax.persistence.spi.PersistenceProvider的实现类
			2. 若项目只有一个实现产品时,可以不用配置
		 -->
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
		
		<properties>
			<!-- 连接数据库的基本信息 -->
			<property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost:5432/jpa-1"/>
			<property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/>
			<property name="javax.persistence.jdbc.user" value="postgres"/>
			<property name="javax.persistence.jdbc.password" value="root"/>
			
			<!-- 配置JPA实现产品的基本属性。因为使用hibernate,故也就是配置hibernate的基本属性 -->
			<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
			<property name="hibernate.show_sql" value="true"/>
			<property name="hibernate.format_sql" value="true"/>
			<!-- 
				hibernate.hbm2ddl.auto参数的作用主要用于:自动创建|更新|验证数据库表结构。如果不是此方面的需求建议set value="none"。 
				create: 
				每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。 
				create-drop : 
				每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。 update: 
				最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据 model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等 
				应用第一次运行起来后才会。
				validate : 
				 每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。
			 -->
			<property name="hibernate.hbm2ddl.auto" value="update"/>
		</properties>
	</persistence-unit>
</persistence>

三、创建实体对象

user(不分大小写)是Postgresql的保留字,故表名改为t_user

package com.hason.jpastudy.entity;

import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "t_user")
public class User implements Serializable{

	private static final long serialVersionUID = -8892552542169372174L;

	private Long id;

	private String name;
	
	private Integer age;

	@Id
	@GeneratedValue
	public Long getId() {
		return id;
	}

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

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}
	
}

三、编写主程序

package com.hason.jpastudy.jpa_2;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

import com.hason.jpastudy.entity.User;

/**
 * 测试JPA
 *
 */
public class App {
	
	public static void main(String[] args) {
		
		String persistenceUnitName = "jpa-2";  // persistence.xml配置里的unit name,可以改变
		
		// 1.创建EntityManagerFactory
		EntityManagerFactory factory = Persistence.createEntityManagerFactory(persistenceUnitName);
		// 2.创建EntityManager
		EntityManager entityManager = factory.createEntityManager();
		// 3.创建、开启事务
		EntityTransaction transaction = entityManager.getTransaction();
		transaction.begin();
		// 4.进行持久化
		User user = new User();
		user.setName("hason");
		user.setAge(18);
		entityManager.persist(user);
		// 5.提交事务
		transaction.commit();
		// 6.关闭EntityManager
		entityManager.close();
		// 7.关闭EntityManagerFacoty
		factory.close();
	}
	
}

四、常见错误:

1、No Persistence provider for EntityManager named **: 原因可能是xml文件位置不不正确(没有正确引入XML)或unit name的名字不对

2、java.lang.NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persistence/Index:Hibernate4.3版本中使用了@Table注解会出现此错误,解决方法之一:使用4.2或其他版本;其他方法百度谷歌

1条评论

0
匿名 says: 回复

log4j:WARN No appenders could be found for logger (org.jboss.logging).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Exception in thread “main” javax.persistence.PersistenceException: No Persistence provider for EntityManager named jpa-2

发表评论

邮箱地址不会被公开。 必填项已用*标注

昵称 *