博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JPA在MySQL中自动建表
阅读量:6489 次
发布时间:2019-06-24

本文共 8677 字,大约阅读时间需要 28 分钟。

  hot3.png

JPA(Java Persistence API)是Spring Boot访问关系型数据库的一个标准接口,它使用ORM(Object-Relational Mapping)方式为数据对象建模和实现持久化。当然JAP也可以应用于其它支持Java的开发框架之中。

在JPA中使用MySQL数据库,只要为其进行建模,就可以自动生成表结构,省略了一些数据库设计的工作。而且,当数据模型更改的时候,应用程序也会对表结构进行更新。需要实现这一功能,主要取决你对使用JPA的配置。

例如,我们有一个数据的实体-关系模型如下图所示。

首先,我们创建项目工程,并引入Spring Boot和JPA的依赖。

其中,Spring Boot依赖如下所示:

UTF-8
1.8
org.springframework.boot
spring-boot-starter-parent
1.4.2.RELEASE
org.springframework.boot
spring-boot-starter
org.springframework.boot
spring-boot-starter-actuator
org.springframework.boot
spring-boot-starter-test
test

JPA和MySQL的依赖如下所示:

org.springframework.boot
spring-boot-starter-data-jpa
mysql
mysql-connector-java
runtime

现在,可以对实体对象进行建模和持久化设计。

用户实体建模,其中User与Role的多对多关系使用一个关系表user_role来存储:

package com.demo.mysql.entity;import org.springframework.format.annotation.DateTimeFormat;import javax.persistence.*;import java.util.Date;import java.util.List;@Entity@Table(name = "user")public class User implements java.io.Serializable{    @Id    @GeneratedValue(strategy = GenerationType.IDENTITY)    private Long id;    private String name;    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")    private Date createdate;    @ManyToMany(cascade = {}, fetch = FetchType.EAGER)    @JoinTable(name = "user_role",            joinColumns = {@JoinColumn(name = "user_id")},            inverseJoinColumns = {@JoinColumn(name = "roles_id")})    private List
roles; public User() { } 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 Date getCreatedate() { return createdate; } public void setCreatedate(Date createdate) { this.createdate = createdate; } public List
getRoles() { return roles; } public void setRoles(List
roles) { this.roles = roles; }}

角色建模:

package com.demo.mysql.entity;import javax.persistence.*;@Entity@Table(name = "role")public class Role implements java.io.Serializable{    @Id    @GeneratedValue(strategy = GenerationType.IDENTITY)    private Long id;    private String name;    public Role() {    }    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;    }}

用户实体持久化:

package com.demo.mysql.repository;import com.demo.mysql.entity.User;import org.springframework.data.jpa.repository.JpaRepository;import org.springframework.stereotype.Repository;@Repositorypublic interface UserRepository extends JpaRepository
{}

角色实体持久化:

package com.demo.mysql.repository;import com.demo.mysql.entity.Role;import org.springframework.data.jpa.repository.JpaRepository;import org.springframework.stereotype.Repository;@Repositorypublic interface RoleRepository extends JpaRepository
{}

JPA及数据源配置,注意其中一行“hibernateProperties.setProperty("hibernate.hbm2ddl.auto", "update");”,将Hibernate的自动处理设置为“update”,表示表结构更改时即进行更新:

package com.demo.mysql.test;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor;import org.springframework.data.jpa.repository.config.EnableJpaRepositories;import org.springframework.jdbc.datasource.DriverManagerDataSource;import org.springframework.orm.jpa.JpaTransactionManager;import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;import org.springframework.orm.jpa.vendor.Database;import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;import org.springframework.transaction.PlatformTransactionManager;import org.springframework.transaction.support.TransactionTemplate;import javax.sql.DataSource;import java.util.Properties;@Configuration@EnableJpaRepositories(basePackages = "com.**.repository")public class JpaConfiguration {    @Bean    PersistenceExceptionTranslationPostProcessor persistenceExceptionTranslationPostProcessor(){        return new PersistenceExceptionTranslationPostProcessor();    }    @Bean    public DataSource dataSource() {        DriverManagerDataSource dataSource = new DriverManagerDataSource();        dataSource.setDriverClassName("com.mysql.jdbc.Driver");        dataSource.setUrl("jdbc:mysql://localhost:3306/test?characterEncoding=utf8");        dataSource.setUsername("root");        dataSource.setPassword("12345678");        return dataSource;    }    @Bean    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {        LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();        entityManagerFactoryBean.setDataSource(dataSource());        entityManagerFactoryBean.setPackagesToScan("com.**.entity");        entityManagerFactoryBean.setJpaProperties(buildHibernateProperties());        entityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter() {
{ setDatabase(Database.MYSQL); }}); return entityManagerFactoryBean; } protected Properties buildHibernateProperties() { Properties hibernateProperties = new Properties(); hibernateProperties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect"); hibernateProperties.setProperty("hibernate.show_sql", "true"); hibernateProperties.setProperty("hibernate.use_sql_comments", "false"); hibernateProperties.setProperty("hibernate.format_sql", "true"); hibernateProperties.setProperty("hibernate.hbm2ddl.auto", "update"); hibernateProperties.setProperty("hibernate.generate_statistics", "false"); hibernateProperties.setProperty("javax.persistence.validation.mode", "none"); hibernateProperties.setProperty("org.hibernate.envers.store_data_at_delete", "true"); hibernateProperties.setProperty("org.hibernate.envers.global_with_modified_flag", "true"); return hibernateProperties; } @Bean public PlatformTransactionManager transactionManager() { return new JpaTransactionManager(); } @Bean public TransactionTemplate transactionTemplate() { return new TransactionTemplate(transactionManager()); }}

测试用例:

package com.demo.mysql.test;import com.demo.mysql.entity.Role;import com.demo.mysql.entity.User;import com.demo.mysql.repository.RoleRepository;import com.demo.mysql.repository.UserRepository;import org.junit.Before;import org.junit.Test;import org.junit.runner.RunWith;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.domain.Page;import org.springframework.data.domain.PageRequest;import org.springframework.data.domain.Pageable;import org.springframework.data.domain.Sort;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import org.springframework.util.Assert;import java.util.Date;import java.util.List;@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(classes = {JpaConfiguration.class})public class MysqlTest {    @Autowired    UserRepository userRepository;    @Autowired    RoleRepository roleRepository;    @Before    public void initData(){        Role role = new Role();        role.setName("admins");        roleRepository.save(role);        Assert.notNull(role.getId());        User user = new User();        user.setName("user");        user.setCreatedate(new Date());        List
roles = roleRepository.findAll(); user.setRoles(roles); userRepository.save(user); Assert.notNull(user.getId()); } @Test public void findPage(){ Pageable pageable = new PageRequest(0, 10, new Sort(Sort.Direction.ASC, "id")); Page
page = userRepository.findAll(pageable); Assert.notNull(page); }}

运行通过,在数据库test中即可以看到生成的表,并且具有上面的一些测试数据,如下图:

转载于:https://my.oschina.net/syic/blog/798994

你可能感兴趣的文章
我的友情链接
查看>>
澳安全局淡定回应***袭击
查看>>
点击图片实现放大镜效果
查看>>
centos6.6升级openssh到最新版本7.5.p1
查看>>
yum源部署LNMP及简介
查看>>
iptables系列之nat及其过滤功能
查看>>
MySQL多线程备份工具mydumper
查看>>
hibernate实体对象,事务管理,锁
查看>>
写自己的MEditor之一:准备工作
查看>>
守护线程的创建和运行
查看>>
我的友情链接
查看>>
生活教会我们的30堂课
查看>>
Maven 本地仓库明明有jar包,pom文件还是报错解决办法(Missing artifact...jar)
查看>>
MVC1.0升级到MVC2.0转换器
查看>>
max3232
查看>>
中文分词技术在电子病历系统中的作用与意义
查看>>
东风601袖珍收音机
查看>>
显示隐藏的断开连接的邮箱
查看>>
2014年国外云使用情况报告
查看>>
Spark初探
查看>>