为什么80%的码农都做不了架构师?>>>   

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

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

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

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

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

<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><java.version>1.8</java.version>
</properties><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.4.2.RELEASE</version><relativePath/>
</parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
</dependencies>

JPA和MySQL的依赖如下所示:

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency>
</dependencies>

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

用户实体建模,其中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<Role> 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<Role> getRoles() {return roles;}public void setRoles(List<Role> 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;@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}

角色实体持久化:

package com.demo.mysql.repository;import com.demo.mysql.entity.Role;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;@Repository
public interface RoleRepository extends JpaRepository<Role, Long> {
}

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 {@BeanPersistenceExceptionTranslationPostProcessor persistenceExceptionTranslationPostProcessor(){return new PersistenceExceptionTranslationPostProcessor();}@Beanpublic 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;}@Beanpublic 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;}@Beanpublic PlatformTransactionManager transactionManager() {return new JpaTransactionManager();}@Beanpublic 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 {@AutowiredUserRepository userRepository;@AutowiredRoleRepository roleRepository;@Beforepublic 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<Role> roles = roleRepository.findAll();user.setRoles(roles);userRepository.save(user);Assert.notNull(user.getId());}@Testpublic void findPage(){Pageable pageable = new PageRequest(0, 10, new Sort(Sort.Direction.ASC, "id"));Page<User> page = userRepository.findAll(pageable);Assert.notNull(page);}
}

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

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

JPA在MySQL中自动建表相关推荐

  1. Spring整合Hibernate中自动建表

    Java代码   <bean id="sessionFactory" class="org.springframework.orm.hibernate3.Local ...

  2. Springboot 之 Hibernate自动建表(Mysql)

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 引入Maven依赖包 <dependency><groupId>org.sp ...

  3. spring boot操作mysql数据库:自动建表,数据添加、查询和修改

    1 mysql自动建表 (1)首先使用IntelliJ IDEA新建spring boot工程,然后在pom.xml中加入mysql的依赖: <!-- MYSQL --><depen ...

  4. 关于使用java程序从excel或者数据库中取出建表规则数据,自动生成数据库建表语句(适用于批量建数据库表)

    公司开发新系统,需要创建几百个数据库表,建表的规则已经写好放到Excel中,如果手动创建的话需要占用较长的时间去做,而且字段类型的规则又被放到了另一张表,如果手动去一个一个去匹配就很麻烦,所以我先把两 ...

  5. hibernate mysql 自动建表_配置hibernate根据实体类自动建表功能

    Hibernate支持自动建表,在开发阶段很方便,可以保证hbm与数据库表结构的自动同步. 如何使用呢?很简单,只要在hibernate.cfg.xml里加上如下代码 Xml代码update upda ...

  6. [NewLife.XCode]反向工程(自动建表建库大杀器)

    NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netstandard,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示 ...

  7. 打包jar文件后的spring部署及hibernate自动建表经验总结

    楔子 用spring+hibernate做一个服务器运行程序,在部署到服务器时(打包成jar,在window server2008下运行),出现了以下两个纠结问题: 1. 加载不了Spring容器 2 ...

  8. Hibernate无法自动建表的缘故

    说一下我的缘故:根本原因是建表的SQL语句错误,不同的版本的hibernate-core包下的不同的Dialect使用的SQL是不一样的,我开启了show-sql后,控制台打印如下: Hibernat ...

  9. 【SSH】——Hibernate实现简单的自动建表

    转载:http://blog.csdn.net/u010066934/article/details/49078445 [与ORM] Object Relational Mapping,对象关系映射, ...

最新文章

  1. 利用openbabel2.4.1进行小分子构象搜索
  2. Intent、Bundle
  3. 分享我的学习记录 svn地址
  4. Debug深度学习中的NAN Loss
  5. mysql主从克隆服务器_mysql主从复制服务器配置
  6. PHP 调用web service接口(.net开发的接口)
  7. linux下php的安装,Linux下PHP安装
  8. Weblogic的classpath设置
  9. 粉丝大失所望,罗永浩回应:做主播赚的不是脏钱
  10. (5)Matplotlib_grid
  11. Java架构师之路:从码农到年薪五十万的架构师
  12. oracle temporarily delayed,temporarily closed造句
  13. 信链可信存证平台CCDP
  14. 机电毕业设计----利用CC2530芯片开发的基于ZigBee技术的灌溉模拟系统----LED显示屏代码解释(源代码)
  15. Xposed模块的编写
  16. 「无刷新跳转」window.history两个新方法pushState和replaceState详解
  17. 深入浅出Linux操作系统搭建JavaEE环境(五)
  18. 带你走进开源阿卡信-v1.0
  19. JQ实现吸顶效果代码
  20. CPU使用率过高咋办?看这里

热门文章

  1. 【Android】Home键
  2. 作用域链(scope chain)和原型链(prototype chain)
  3. String,StringBuffer与StringBuilder的区别
  4. Mac 编译报错 symbol(s) not found for
  5. P1772 [ZJOI2006]物流运输 最短路+DP
  6. CSS实现导航条Tab切换的三种方法
  7. Android开发之动态添加控件
  8. codefore 213 C Relay Race (朴素DP)
  9. 【转】BLE 学习记录
  10. AjaxPost、冒泡示例