【问题标题】:Table creation via JPA通过 JPA 创建表
【发布时间】:2015-01-27 10:18:22
【问题描述】:

我有一个实体类ClassA,其中包含

@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
List<ClassB> possibleValues; 

此语句将在表classa 中输入值,并在其中输入classb 中的值,对应于ClassA

它是否创建任何类似classa_possible_values 的表并输入值?

【问题讨论】:

    标签: java jakarta-ee jpa


    【解决方案1】:

    您可以使用注释设置哪个实体是关系的所有者,并设置数据在数据库中的存储方式。

    例如,您可以将 ClassB 表中的外键设置为 ClassA。实体 ClassA 中的 ClassB 列表在 ClassA 表中没有任何列,但该列表作为外键保存在 ClassB 中。要实现这一点,您需要在“OneToMany”注释中添加一个 mappedBy 值,并在 ClassB 中添加一个“ManyToOne”注释:

    @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER, mappedBy=classA)
    List<ClassB> possibleValues;
    

    在 B 类中:

    @Entity
    public ClassB {
        ...
        @ManyToOne
        ClassA classA;
        ...
    }
    

    还有其他选项,例如为关系创建 joinTable,但我认为这是更简单的解决方案。

    如果要基于 JPA 注解生成数据库模式,则需要在配置中添加一些属性,例如,这是为 JPA/Hibernate 添加此配置的方法:Hibernate schema generation properties

    【讨论】:

    • 好的,我目前的情况是 ClaasA 值被持久化到表 classa,ClassB 值对应于 ClassA 被持久化到 classb,并且已经生成映射到两个主 id 的映射表。ClassB不包含@ManyToOne。您对此配置有任何想法吗?我应该按照您的建议为classA 创建@ManyToOne 吗?
    • 如果不设置'ManyToOne'注解,则会创建一个连接表。您不能在 ClassA 表行中存储多个 ClassB 外键。如果ClassB中设置了'ManyToOne'注解,ClassA的外键可以存放在ClassB表中,不需要join表。
    • 谢谢 :) 你能给我推荐一些教程吗?
    • 你应该可以找到一些很好的 JPA 教程,无论如何这是一个关于这个主题的简短教程:Understanding JPA, Part 2: Relationships the JPA way。如果你想花一些时间学习 JPA,我强烈推荐这本书:PRO JPA2 Mastering the Java Persistence API
    • 耶!我知道链接,但不知道详细的课程。感谢您推荐书和给时间:)
    【解决方案2】:

    这个注解不会生成表格,这些只是定义表格之间的关系。如果您添加 @JoinColumn 注释,那么您的 JPA 提供程序将生成一个外键

    【讨论】:

    • JPA 不会自行创建条目。仅当您保留条目时。
    猜你喜欢
    • 2011-09-02
    • 2019-05-21
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    • 2021-09-12
    • 2019-07-09
    • 2020-12-10
    • 2021-09-09
    相关资源
    最近更新 更多