springboot-jpa通过表完成分布式id 生成, @GeneratedValue和@TableGenerator用法
准备工作
pom文件
<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.dkp</groupId> <artifactId>springboot-jpa</artifactId> <version>1.0.0</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.6.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build></project>
创建表
-- mysqlcreate table id_gen (GEN_KEY varchar(255) not null, GEN_VALUE bigint, primary key (GEN_KEY));
准备实体
package com.dkp.entity;import javax.persistence.*;@Entity@Table(name = "t_user")public class User { /** * table 主键表名 * pkColumnName 主键表 的主键列 * valueColumnName 主键表 数字列 * pkColumnValue 需要生成Id的 数据表名称 * allocationSize 每次缓存的id 长度 * 注意:generator 的值要和 @TableGenerator中name的值保持一致 */ @Id @GeneratedValue(strategy = GenerationType.TABLE, generator = "userGen") @TableGenerator(name = "userGen", table = "ID_GEN", pkColumnName = "GEN_KEY", valueColumnName = "GEN_VALUE", pkColumnValue = "t_user" ) private Long id; private Integer age; private String uname; private String note; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getUname() { return uname; } public void setUname(String uname) { this.uname = uname; } public String getNote() { return note; } public void setNote(String note) { this.note = note; } @Override public String toString() { return "User{" + "id=" + id + ", age=" + age + ", uname='" + uname + '\'' + ", note='" + note + '\'' + '}'; }}
准备dao
package com.dkp.dao;import com.dkp.entity.User;import org.springframework.data.jpa.repository.JpaRepository;import org.springframework.data.jpa.repository.Query;import org.springframework.data.repository.query.Param;import java.util.List;import java.util.Map;public interface UserDao extends JpaRepository<User, Long> { @Query(value = "select uname from t_user where id = :id" ,nativeQuery = true) List<Map<String,Object>> getUser(@Param("id") Long id);}
准备 启动类
package com.dkp;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class App { public static void main(String[] args) { SpringApplication.run(App.class,args); }}
创建test类测试
@RunWith(SpringRunner.class)@SpringBootTestpublic class AppTest { @Autowired private UserDao userDao; @Test public void test01(){ User user = new User(); user.setNote("我是笔记1"); user.setUname("hq1"); user.setAge(32); User tuser = userDao.save(user); System.out.println(tuser); }}
git 项目地址:https://gitee.com/dukangping/springboot-jpa