简介
自从Sun 推出JPA(Java Persistence API)以来,使用Jpa的越来越多了,再不是之前那种只使用Hibernate,MyBaits等等框架了。JPA的一个核心目的就是要整合ORM技术,实现天下归一。
项目搭建
本文就以一个简单的图书出版社为例,集成Spring和Hibernate技术,存储使用MySQL数据库,搭建一个Spring Data JPA项目。
数据库设计
对于Web项目来说,数据库可以说是重之又重了。数据是设计的基础,直接决定系统的成败。如果数据库设计不合理、不完善,将在系统开发中,甚至到后期维护时,引起严重的问题。当然了,在我们这里只是一个简单的Demo示例,不用考虑那么多,实际项目中可能就不一样了。 下面贴一下数据库的设计。很简单就一个图书和出版社的表,然后出版社又可以出版多本书,所以在图书中添加一个外键,与出版社进行链接,使其成为多对一的模式。
项目依赖
项目主要就是依赖Spring + Hibernate,然后再添加一下junit方便后续测试使用。 pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.spring</groupId>
<artifactId>jpa</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<spring.version>4.3.1.RELEASE</spring.version>
<log4j.version>2.6.2</log4j.version>
<hibernate.version>5.1.0.Final</hibernate.version>
</properties>
<dependencies>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>1.10.1.RELEASE</version>
</dependency>
<!-- JavaEE -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!-- Hibernate -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-c3p0</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.3</version>
</dependency>
<!-- Test -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
项目结构搭建
项目整体结构如下,很简单只为演示: 下面一步步说一下搭建的过程吧
添加JPA框架
新建一个项目,然后在项目上右键,点击Add Framework Support..。
默认没有数据源配置,因此我们需要先添加一个,我们使用的是MySQL,所以这里就选择MySQL咯:
数据源的配置,这个就没什么好说的了。依次填入MySQL运行的主机地址、数据库名、登录用户名和密码。最后保险起见,点击一下Test Connection测试连接。
数据源配置完成了,我们再来继续先前的配置,选择我们刚刚添加的数据源,输入生成的实体类和配置文件放置的包名。最后需要点击刷新一下才能看到实际数据库中的表。
还记得我们之前设计数据库的表时,是有外键的。在这里默认是无法自动根据外键添加相应的关系,我们可以在生成代码后再手动的修改,也可以在这里就添加外键关系。 选中books表,右键点击,然后再点击Add Relationship,进行以下配置:
外键关系配置完成后,我们选择一下需要生成的字段,原先的publisherId是int类型的,就不需要再生成了,直接生成对应的外键实体类,因为我们设计时用的是多对一在publishers中也不用生成实体类成员了:
这样生成过后,我们还需要手动修改一下,因为这样生成的是一对一映射,不符合我们的设计,如生成的BooksEntity.java代码外键映射是这样的:
@OneToOne
@JoinColumn(name = "publisherId", referencedColumnName = "id")
public PublishersEntity getPublishers() {
return publishers;
}
我们手动把@OneToOne注解改为@ManyToOne:
@ManyToOne
@JoinColumn(name = "publisherId", referencedColumnName = "id")
public PublishersEntity getPublishers() {
return publishers;
}
把对应的xml映射文件当中的也配置也改为多对一:
<many-to-one name="publishers" optional="true" target-entity="com.spring.jpa.entity.PublishersEntity">
<join-column name="publisherId" nullable="false" referenced-column-name="id"/>
</many-to-one>
JPA的配置文件是生成在META-INF/persistence.xml,初始内容为:
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
<persistence-unit name="NewPersistenceUnit">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<mapping-file>com/spring/jpa/entity/BooksEntity.xml</mapping-file>
<mapping-file>com/spring/jpa/entity/PublishersEntity.xml</mapping-file>
<class>com.spring.jpa.entity.BooksEntity</class>
<class>com.spring.jpa.entity.PublishersEntity</class>
<properties>
<property name="hibernate.connection.url" value="jdbc:mysql://192.168.1.2:3306/bookshop"/>
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
<property name="hibernate.connection.username"/>
<property name="hibernate.connection.password"/>
<property name="hibernate.archive.autodetection" value="class"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hbm2ddl.auto" value="update"/>
</properties>
</persistence-unit>
</persistence>
我们也需要进行相应的配置,在这里就只有数据库的用户名和密码是必须的,然后也可以加一下方言之类的配置,以下为修改后的配置,如果需要run的话,要把数据库相应的配置改为自己的。如:连接url,用户名,密码这些。
<properties>
<property name="hibernate.connection.url" value="jdbc:mysql://192.168.1.2:3306/bookshop"/>
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
<property name="dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
<property name="hibernate.connection.username" value="root"/>
<property name="hibernate.connection.password" value="lu123"/>
<property name="hibernate.archive.autodetection" value="class"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hbm2ddl.auto" value="update"/>
</properties>
好了,JPA的配置就到此结束了,不过还有Spring的配置哦。
Spring配置
以下为Spring的配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<mvc:annotation-driven/>
<jpa:repositories base-package="com.spring.jpa.repository"/>
<!-- 事务管理 -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<!-- 开启事务管理注解 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
<!-- 链接到persistence.xml -->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceXmlLocation" value="persistence.xml"/>
</bean>
</beans>
很简单,我们再写一下Spring Jpa的repository吧,这个默认更简单,只需要新建一个接口,然后继承JpaRepository即可。
package com.spring.jpa.repository;
import com.spring.jpa.entity.BooksEntity;
import org.springframework.data.jpa.repository.JpaRepository;
/**
* Created by Administrator on 2016/10/23.
*/
public interface BooksRepository extends JpaRepository<BooksEntity, Integer> {
}
在这里需要注意,这个接口是需要带有泛型的。 前面一个参数为映射的实体类, 后面一个参数为表Id字段的数据类型。
测试
逻辑基本上就写完了,由于这个没有写web界面,只能通过单元测试来看看效果了。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:appContext.xml")
public class RepositoryTest {
@Autowired
private BooksRepository booksRepository;
@Autowired
private PublishersRepository publishersRepository;
@Test
public void testGetBooksAll() throws Exception {
List<BooksEntity> books = booksRepository.findAll();
for (BooksEntity book : books) {
System.out.println(book.toString());
}
}
@Test
public void testGetBook() throws Exception {
BooksEntity b = booksRepository.findOne(1);
System.out.println(b);
}
@Test
public void testDeleteBook() throws Exception {
booksRepository.delete(1);
}
@Test
public void testAddPublishers() throws Exception {
PublishersEntity publisher = new PublishersEntity();
publisher.setName("长江出版社");
publishersRepository.saveAndFlush(publisher);
}
总结
不知不觉就贴那么多了,都是比较初级的东西。不过也是一个学习的过程吧。其实这个示例还不完全,比如说现在都可以直接用注解,可以把映射的.xml文件都删掉了,然后保存含有外键的那个BookEntity实体,也还不是很懂。还需要继续学习啊,以后熟悉了再更新吧。
最后代码都保存在Github上了:
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/2060.html