如果已经在 SQL 脚本中创建数据库,我是否需要冗余的 JPA 注释?



这感觉一点也不干。

我有一个生成所有数据库表的 SQL 脚本,因此我的@Entity类中有很多冗余注释。

例如

@Column(unique = true, length = 254)
@NotNull
private String email;

或自动递增逻辑,例如

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;

考虑到我已经声明的 SQL 中的所有这些字段注释都是多余的。

有什么理由保留这些注释吗? 据我了解,任何类型的严肃应用程序都应该使用 SQL 脚本来创建数据库表,而且在我编写的类中减少噪音肯定会很好。

示例中有两种类型的注释(DDL 和验证类型):

@Column(unique = true, length = 254)
@NotNull
  1. @NotNull是一个 JSR 303 Bean 验证注释。它与数据库约束本身无关。它由验证处理器使用,不与数据库连接。因此,它在您的映射中不是多余的。 但是,例如

    @Column(可为空 = false) - 它为 JPA 提供程序提供提示,以生成正确的 DDL 以创建具有数据库约束的表列

阿拉伯数字。@Column(唯一 = true,长度 = 254)它们是休眠生成的 DDL 提示。

但是对于@Column(可更新= 假,名称 = "flight_name",可为空 = 假,长度 = 50) 可更新 - 它不是 DDL,它是优化。

来自 Hibernate 文档

@Column(
ddl/mapping : name="columnName"; 
optimization: boolean insertable() default true;
optimization: boolean updatable() default true;
ddl/mapping  : String table() default "";
DDL -->: boolean unique() default false;
DDL -->: boolean nullable() default true;
DDL -->: String columnDefinition() default "";
DDL -->: int length() default 255;
......
)

如果使用 ddl 脚本,则所有休眠 ddl 注释属性都是冗余的(如果在内存测试中使用,则会对内存中的数据库进行自动生成),并且仅在您在 hibernate/jpa config 中配置了 hibernate.hbm2ddl.auto 选项时才使用。此外,当您授予休眠权限以在生产环境中执行 DDL 时,这是非常危险的情况。

有关生产工作:参见 liquibase , flywaydb for DDL。

我想到的两个原因:

  1. 当您让 hibernate 在测试中使用的内存数据库中创建和删除架构时,它们在集成测试中非常有用。
  2. Hibernate
  3. 在运行时也使用其中的极少数来进行一些优化,例如当Hibernate知道为延迟关联创建代理而不是切换到预先加载是安全的时,optional = false(非null)与一对一关联的@PrimaryKeyJoinColumn结合使用。

最新更新