mysql jpa 不要自动建表_JPA在MySQL中自动建表

本文介绍了如何在Spring Boot项目中使用JPA(Java Persistence API)与MySQL数据库配合,实现数据对象建模和自动创建/更新表结构。通过配置JPA的hibernate.hbm2ddl.auto属性为'update',可以实现在数据模型更改时自动更新表结构。文中还展示了实体类、数据源配置、持久化接口和测试用例。
摘要由CSDN通过智能技术生成

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

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

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

7ba87da4471b3806d1317627abfd68b2.png

首先,我们创建项目工程,并引入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;

@Repository

public 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;

@Repository

public 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中即可以看到生成的表,并且具有上面的一些测试数据,如下图:

5cc5e033c2e3523eba9537751fa01276.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值