SpringDataJPA配置

导读:本篇文章讲解 SpringDataJPA配置,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

简介

自从Sun 推出JPA(Java Persistence API)以来,使用Jpa的越来越多了,再不是之前那种只使用Hibernate,MyBaits等等框架了。JPA的一个核心目的就是要整合ORM技术,实现天下归一。

项目搭建

本文就以一个简单的图书出版社为例,集成Spring和Hibernate技术,存储使用MySQL数据库,搭建一个Spring Data JPA项目。

数据库设计

对于Web项目来说,数据库可以说是重之又重了。数据是设计的基础,直接决定系统的成败。如果数据库设计不合理、不完善,将在系统开发中,甚至到后期维护时,引起严重的问题。当然了,在我们这里只是一个简单的Demo示例,不用考虑那么多,实际项目中可能就不一样了。 下面贴一下数据库的设计。很简单就一个图书和出版社的表,然后出版社又可以出版多本书,所以在图书中添加一个外键,与出版社进行链接,使其成为多对一的模式。 bookshop

项目依赖

项目主要就是依赖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>

项目结构搭建

项目整体结构如下,很简单只为演示: spring data jpa 下面一步步说一下搭建的过程吧

添加JPA框架

add jpa 新建一个项目,然后在项目上右键,点击Add Framework Support..

按照以下步骤依次配置: jpa hibernate

然后弹出生成实体类和数据库Schema配置对话框: datasource

默认没有数据源配置,因此我们需要先添加一个,我们使用的是MySQL,所以这里就选择MySQL咯: mysql datasource

数据源的配置,这个就没什么好说的了。依次填入MySQL运行的主机地址数据库名登录用户名密码。最后保险起见,点击一下Test Connection测试连接。 mysql driver

数据源配置完成了,我们再来继续先前的配置,选择我们刚刚添加的数据源,输入生成的实体类和配置文件放置的包名。最后需要点击刷新一下才能看到实际数据库中的表。 import datasource

还记得我们之前设计数据库的表时,是有外键的。在这里默认是无法自动根据外键添加相应的关系,我们可以在生成代码后再手动的修改,也可以在这里就添加外键关系。 选中books表,右键点击,然后再点击Add Relationship,进行以下配置: relationship

外键关系配置完成后,我们选择一下需要生成的字段,原先的publisherId是int类型的,就不需要再生成了,直接生成对应的外键实体类,因为我们设计时用的是多对一在publishers中也不用生成实体类成员了: generate

这样生成过后,我们还需要手动修改一下,因为这样生成的是一对一映射,不符合我们的设计,如生成的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

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!