gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 06:40:04 27 4
gpt4 key购买 nike

这根本感觉不太干。

我有一个生成所有数据库表的 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(nullable = false) - it gives the jpa provider hints to generate the right DDL for creating table columns with the database constraints

2.@Column(unique = true, length = 254) 它们是 hibernate 生成的 ddl 的提示。

但对于 @Column(可更新 = false, name = "flight_name", nullable = false, length=50) 可更新 - 这不是 ddl ,而​​是优化。

from hibernate docs

@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 脚本,所有 hibernate ddl-annotation 属性都是多余的(如果您在内存测试中使用,则会自动生成内存数据库),并且仅在您配置 hibernate.hbm2ddl 时才会使用。 hibernate/jpa 配置中的 auto 选项。此外,当您授予 Hibernate 在生产中执行 DDL 的权限时,这是非常危险的情况。

对于生产工作:请参阅 liquibase , flywaydb对于 DDL。

关于java - 如果数据库已经在 SQL 脚本中创建,我是否需要冗余的 JPA 注释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44509274/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com