有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    可以使用@JoinTable设置多对多表

    关于约束名称。hibernate并不支持每个数据库的所有功能。因此,schema generate只是为了帮助您。在投入生产之前,你必须阅读、修复并测试它。同时,将hibernate与auto.ddl=update一起投入生产是一个非常糟糕的主意。不要这样做。相反,总是使用sql文件来构建schama

    对于约束名称,问题并不大。你可以创建自己的hibernate,即使在validate模式下也不应该抱怨

    也考虑使用DB迁移工具,如FraveW/P>