Skip to content
Yong Zhu edited this page Jan 20, 2018 · 19 revisions

主键定义

jDialects具有根据Java配置或用注解标注的实体类生成数据库脚本DDL的功能,对涉及到主键DDL生成的实体类注解提供解析和缺省实现。

在实体类字段上添加@Id或@PKey注解,或调用其对应的Java配置方法id()或pkey(),可以定义虚拟表格模型(TableModel)的主键列, 例如下面的两种配置中将"user_id"列定义为主键列:

  @Table(table="user_tb")
  public class User{
    @Column(name="user_id")
    @Id
    private Integer userId;
    ...
  }
或
  TableModel t1 = new TableModel("user_tb");
  t1.column("user_id").INTEGER().pkey().entityField("userId");

从上面的写法可看到:注解方式配置依赖于实体类,如果没有实体类,则无法生成DDL, 而Java配置则方法以列名为主,实体字段为辅(可不设值),没有实体类也可以创建DDL。

如果虚拟表格模型中有多个列被定义为主键,则在生成DDL时这些列将被创建成复合主键。

@Id注解既可以使用jDialects自带的com.github.drinkjava2.jdialects.annotation.jpa.Id注解,也可以使用标准的JPA注解javax.persistence.Id,它们的效果是等同的。

虚拟表格模型中已经定义好的列可以用tableModel.getColumn("列名")来获取一个ColumnModel实例,并修改它的配置,这是Java方法配置与注解方式配置方式的最大区别。注解方式配置是固定的。而Java配置方式,TableModel实例中的约束、外键、索引等都可以在运行期被创建、修改、删除,这给了程序员极大的发挥余地。

用注解标注的实体类被解析时首先将被转换成一个虚拟表格模型(TableModel), 所以基于jDialects的ORM工具jSqlBox既具有固定的注解方式配置,也有能力在运行期动态改变配置,也可以两者混用,先用固定注解配置实体,再在程序中获取TableModel实例后进行修改。

注:jDialects在设计注解名称时尽量向JPA靠拢, 以下jDialects自带的注解与JPA注解同名, 且效果完全等同, 使用时既可以用jDialects自带的注解, 也可以使用标准JPA注解:
@Entity, @Transient, @UniqueConstraint, @GenerationType, @Id, @Index, @SequenceGenerator, @GeneratedValue, @Table, @Column, @TableGenerator

jDialects没有对JPA库的依赖, 为了实现支持JPA注解而无需添加JPA库依赖, 它通过运行时的反射机制来读取JPA注解并解析。

Clone this wiki locally