项目场景:
最近拿到一个springboot项目源码,但是里面没有mysql建表语句,本文就使用springboot+jpa来实现自动建表
首先,引入jpa的maven依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>
接下来,在yml文件中加上这一段配置,即可
spring: jpa: hibernate.ddl-auto: update show-sql: true
接着,在你需要生成表的实体类上加上对应的注解:@Entity、@Table、@Id等
@Data @Entity @Table(name = "borrow_book") public class BorrowBook implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long borrowId; //图书id private Long bookId; //借书人id private Long readerId; //借书时间 private Date borrowTime; //还书时间 private Date returnTime; //0: 待审核 1: 已审核 2:拒绝 private String applyStatus; //0:审核中 1:在借中 2:已还 3:拒绝 private String borrowStatus; //1: 正常还书 2:异常还书 private String returnStatus; //异常还书备注 private String excepionText; //审核拒绝备注 private String applyText; }
启动服务,额,发现报错了
[org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: No identifier specified for entity: com.itmk.web.book_borrow.entity.BorrowBook
原来是因为 @Id 这个包导入错了
错误的导包 import org.springframework.data.annotation.Id; 正确的导包 import javax.persistence.Id;
重新启动服务,额,又发现另外一个实体类也报错了
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.MappingException:Could not determine type for: java.util.List, at table: sys_menu, for columns: [org.hibernate.mapping.Column(children)]
我们看一下报错的这个实体类,发现它里面有一个成员变量List children = new ArrayList<>();,这个其实是不应该生成表字段的
@Data @Entity @Table(name = "sys_menu") public class SysMenu { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long menuId; private Long parentId; private String title; private String code; private String name; private String path; private String url; //类型(0 目录 1菜单,2按钮) private String type; private String icon; private String parentName; private Long orderNum; private Date createTime; private Date updateTime; private List<SysMenu> children = new ArrayList<>(); private Boolean open; }
解决办法是:加上注解@Transient
@Data @Entity @Table(name = "sys_menu") public class SysMenu { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long menuId; ... //不属于数据库表中的字段,需要排除 @Transient private List<SysMenu> children = new ArrayList<>(); //不属于数据库表中的字段,需要排除 @Transient private Boolean open; }
最后启动一下服务,也没有什么报错了,成功创建