本文主要介绍了DBeaver如何操作,可以自动生成ER图,DBeaver的版本是6.2.0。表使用JPA自动生成。具体JPA的使用见JPA规范总结和整理
创建表格
创建实体类
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Table(name = "company")
public class Company {
@Id
@Column(name = "id", columnDefinition = "varchar(64)")
@GenericGenerator(name="idGenerator", strategy="uuid")
@GeneratedValue(generator = "idGenerator")
private String id;
private String name;
private String address;
}
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Table(name = "employee", uniqueConstraints = {@UniqueConstraint(columnNames={"department_id","company_id"})})
public class Employee {
@Id
@Column(name = "id", columnDefinition = "varchar(64)")
@GenericGenerator(name="idGenerator", strategy="uuid")
@GeneratedValue(generator = "idGenerator")
private String id;
@Column(name = "name", columnDefinition = "varchar(128) default null")
private String name;
@Column(name = "department_id", columnDefinition = "varchar(32) default null")
private String departmentId;
@JoinColumn(name="company_id")
@ManyToOne(cascade={CascadeType.MERGE,CascadeType.REFRESH},optional=false)
private Company company;
}
改配置文件自动生成表格
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.database=mysql
spring.jpa.open-in-view=false
乱入一下:简单记录下别人整理的spring.jpa.open-in-view配置作用
open-in-view 是 Spring Boot 自动加载 Spring Data JPA 提供的一个配置,全称为 spring.jpa.open-in-view=true,它只有 true 和 false 两个值,默认是 true。那它到底有什么威力呢?
通过上面的源码我们可以看到,spring.jpa.open-in-view 的主要作用就是帮我们加载 OpenEntityManagerInViewInterceptor 这个类 我们可以发现,OpenEntityManagerInViewInterceptor 实现了 WebRequestInterceptor 的接口中的两个方法:
public void preHandle(WebRequest request) 方法,里面实现了在每次的 Web MVC 请求之前,通过 createEntityManager 方法创建 EntityManager 和 EntityManagerHolder 的逻辑;
public void afterCompletion(WebRequest request, @Nullable Exception ex) 方法,里面实现了在每次 Web MVC 的请求结束之后,关闭 EntityManager 的逻辑。
我们如果继续看 createEntityManager 方法的实现,还会找到如下关键代码。 我们通过 SessionFactoryImpl 中的 createEntityManager() 方法,创建了一个 EntityManager 的实现 Session;通过拦截器创建了 EntityManager 事务处理逻辑,默认是 Join 类型(即有事务存在会加入);而 builder.openSession() 逻辑就是 new SessionImpl(sessionFactory, this)。
所以这个时候可以知道,通过 open-in-view 配置的拦截器,会帮我们的每个请求都创建一个 SessionImpl 实例;而 SessionImpl 里面存储了整个 PersistenceContext 和各种事务连接状态,可以判断出来 Session 的实例对象比较大。
并且,我们打开 spring.jap.open-in-view=true 会发现,如果一个请求处理的逻辑比较耗时,牵涉到的对象比较多,这个时候就比较考验我们对 jvm 的内存配置策略了,如果配置不好就会经常出现内存溢出的现象。因此当处理比较耗时的请求和批量处理请求的时候,需要考虑到这一点。
运行程序,自动创建表格
创建后的表格打印如下,可以看到是有外键生成的
Hibernate: create table company (id varchar(64) not null, address varchar(255), name varchar(255), primary key (id)) engine=InnoDB
Hibernate: create table employee (id varchar(64) not null, department_id varchar(32) default null, name varchar(128) default null, company_id varchar(64) not null, primary key (id)) engine=InnoDB
Hibernate: alter table employee drop index UKir8n5ax8yt8608nlq39f6aw0t
Hibernate: alter table employee add constraint UKir8n5ax8yt8608nlq39f6aw0t unique (department_id, company_id)
Hibernate: alter table employee add constraint FK5v50ed2bjh60n1gc7ifuxmgf4 foreign key (company_id) references company (id)
DBeaver中生成ER图
ctrl+左键选中需要创建ER关系图的表,右键菜单栏里点击创建新的ER图 填写图表的名字,点击完成 自动生成了er图 点击连线,可以看到外键
|