java Hibernate注释约束的名称
我开始在一个项目中使用注释作为了解它们的借口,我有一个问题
我为数据库中的每个表创建了域类,并使用注释将成员与列连接起来,使用验证之类的东西。我还通过使用uniqueConstraints使用唯一索引约束,如果我有多对一或多对多关系,我会使用jointable和join列
我的问题有两个,可能有点天真
1)我设置了休眠。hbm2ddl。自动在持久性xml中创建,然后运行应用程序,以便通过应用程序创建数据库。然后我转到数据库,导出了模式创建sql文件。这是获取sql创建模式的有效实践吗?此外,我注意到,虽然我在外键和索引的注释中使用的Constant名称被转移,但在我的多对多关系中,这些名称是生成的名称,而不是我指定的名称。除了我可能做错了什么以外还有什么原因吗
2)如果我从上面得到了模式,将约束的名称固定到我想要的,然后运行它来创建数据库,然后运行应用程序,但要设置persistense xml选项hibernate。hbm2ddl。自动设置为“更新”会不会因为约束的名称可能与注释中的名称不匹配而导致问题
对于多对多关系,这是两个域类
@Entity
@Table(name = "SOLUTION")
public class Solution {
@Id
@Column(name = "SOLUTION_CODE", length = 20, nullable = false)
@Size(min = 1, max = 20, message = "The solution code size is not within limits (0-20)")
@NotNull(message = "The solution code cannot be null")
private String code;
@Column(name = "SOLUTION_DESCRIPTION", length = 200, nullable = false)
@Size(min = 1, max = 200, message = "The solution description is not within limits (0-200)")
@NotNull(message = "The solution description cannot be null")
private String description;
@ManyToMany(mappedBy = "solutionList")
private List<Category> categories;
public Solution() {
}
}
@Entity
@Table(name = "CATEGORY")
public class Category {
@Id
@Column(name = "CATEGORY_CODE", length = 20, nullable = false)
@Size(min = 1, max = 20, message = "The category code size is not within limits (0-20)")
@NotNull(message = "The category code cannot be null")
private String code;
@Column(name = "CATEGORY_DESCRIPTION", length = 200, nullable = false)
@Size(min = 1, max = 200, message = "The category description is not within limits (0-200)")
@NotNull(message = "The category description cannot be null")
private String description;
@ManyToMany
@JoinTable(
name = "SOLUTION_CATEGORY_MAPPING",
joinColumns = @JoinColumn(
name = "CATEGORY_CODE",
referencedColumnName = "CATEGORY_CODE",
foreignKey = @ForeignKey(name = "FK_SOLUTION_CATEGORY_CATEGORY_CODE")),
inverseJoinColumns = @JoinColumn(
name = "SOLUTION_CODE",
referencedColumnName = "SOLUTION_CODE",
foreignKey = @ForeignKey(name = "FK_SOLUTION_CATEGORY_SOLUTION_CODE")))
private List<Solution> solutionList;
public Category() {
}
}
我希望外键约束具有我指定的名称,但它们只是生成了名称
编辑:我还想知道,是否有人会过度使用注释,以及它们是否会影响性能
# 1 楼答案
可以使用
@JoinTable
设置多对多表关于约束名称。hibernate并不支持每个数据库的所有功能。因此,schema generate只是为了帮助您。在投入生产之前,你必须阅读、修复并测试它。同时,将hibernate与
auto.ddl=update
一起投入生产是一个非常糟糕的主意。不要这样做。相反,总是使用sql文件来构建schama对于约束名称,问题并不大。你可以创建自己的hibernate,即使在
validate
模式下也不应该抱怨也考虑使用DB迁移工具,如FraveW/P>