我开始在项目中使用注释作为一个借口来掌握它们的诀窍,我有一个问题。
我为数据库中的每个表创建了域类,并使用注释将成员与列连接起来,使用验证之类的东西。我还通过使用uniqueConstraints来使用唯一索引约束,并且在具有多对一或多对多关系的情况下,我使用jointable和join列。
我有两个问题,可能有点天真,
1)我将hibernate.hbm2ddl.auto设置为在persistence xml中创建,然后运行应用程序,以便通过应用程序创建数据库。然后,我转到数据库并导出模式创建sql文件。这是获取创建模式sql的有效实践吗?此外,我还注意到,虽然我在外键和索引的注释中使用的约束名称是传输的,但在我的多对多关系中,名称是生成的名称,而不是我指定的名称。除了我可能做错了什么以外,还有其他原因吗?
2)如果我从上面获得模式,将约束的名称固定为我想要的,然后运行它来创建数据库,并运行应用程序,但是将persistense xml选项hibernate.hbm2ddl.auto设置为update是否会导致问题,因为约束的名称可能与注释中的名称不匹配?
对于多对多关系,这是两个域类
@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() {
}
}我希望foreign key约束具有我指定的名称,但它们只是生成了名称
编辑:另外,我想知道是否有人会过度使用注释,以及它们是否会影响性能?
发布于 2015-04-22 05:16:51
可以使用@JoinTable设置多对多表
关于约束名称。当然,hibernate并不支持每个数据库的所有功能。因此,模式生成只是为了帮助您。在将其投入生产之前,您必须阅读它、修复它并对其进行测试。此外,将hibernate放在auto.ddl=update的生产环境中也是一个非常糟糕的主意。不要这样做。相反,始终使用sql文件来构建schama。
使用约束名称的问题并不大。你可以创建你自己的,hibernate即使在validate模式下也不应该抱怨。
还可以考虑使用db迁移工具,如flyway。
https://stackoverflow.com/questions/29782323
复制相似问题