java - 将条目映射到 Hibernate 中的单独列

标签 java database hibernate orm jpa-2.0

假设我有一个 Players 表:

ID | name  | email | age | ...
1  | 'bob' | null  | 23  | ...

有很多列(比如 50),每列(ID 除外)都可能为空。请忽略表格设计,现在必须保持这种状态:-(

我想将此表映射到一个实体(即我希望它同时用于保存和读取):

public class Player implements Serializable {  
    private Map<String, String> attributes;
    // more code, ctor, setters, getters etc...
}

表中的每一列都被读取为 map 的条目。因此,在给定的示例中, map 将具有具有适当值的键 IDnameemail 等。

如果 Hibernate 需要,我可以使用单独的 id 成员,但我想避免在一个类中有 50 个成员

这在 Hibernate 4 中可能吗?

最佳答案

我不确定维护 Map 是否可行,如果可行,它对可读性有何影响。

但是您可以改用@Embeddable@AttributeOverride 注释。

为了避免一个类中有 50 个成员,您可以按一些共同属性对成员进行分组,并将每个组放在一个单独的类中。然后,您必须使用 @Embeddable 注释每个类,这将使它们的实例成为可嵌入对象(或组件)。这些是其属性映射到与拥有实体的表相同的表的对象。例如,假设您决定将 nameageemail 属性分组到一个类中,称为 PersonalData

可选地,您可以随意命名属性,但是您必须使用 @Column 注释来告诉 Hibernate 您正在谈论的是哪个数据库表列。

@Embeddable
public class PersonalData implements Serializable {
    private String fullname;

    private String email;

    private String age;

    //accessors
}

您可以根据需要创建尽可能多的 @Embeddable 注释类。拥有一个包含 50 个成员的 @Embeddable 类并不是一个好主意,因此您可以将成员分散到多个类中。

完成后,我们回到被@Entity注释的类。它的成员将是用 Embeddable 注解注解的 @Embeddable 类的实例。 @AttributeOverrides 注释将有助于将每个嵌入式组件的成员与特定的数据库表列相匹配。例如:

@Entity
public class Person implements Serializable {
    @Embedded (
        @AttributeOverrides(name = "fullname", column = @Column(name = "name"))
        @AttributeOverrides(name = "email", column = @Column(name = "email"))
        @AttributeOverrides(name = "age", column = @Column(name = "age"))
    )
    private PersonalData personalData;

    //other @Embedded-annotated members.
}

关于java - 将条目映射到 Hibernate 中的单独列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21904041/

相关文章:

java - 向员工分配工作量的最佳策略

java - 单表单元格中的对象

mysql - 如何在sql中使用自动增量在id列中添加前缀?

hibernate - Spring 和 JUnit 注释测试 : creating fixtures in separate transactions

hibernate - 通过持久属性的反射访问字段 xxx 时出错

spring - Kotlin Hibernate 中删除 ManyToOne 列表类型

java - 来自浏览器的延迟/Ping 测试

java - Android 音频标准化或调平

java - 完全删除 jtable 网格(单元格边框)

database - 面向对象的数据库还在使用吗?