如何从JPA中的“词典表”中提取值

时间:2019-07-04 10:18:41

标签: java hibernate jpa

我想将两个表(ManyToOne连接)映射到Java中的一个对象。一个是主要的CatalogObject表,第二个只是可能的对象类型的字典。在Java中,我只想拥有String类型,而不是映射到新对象。 当我要搜索类中的所有对象(例如“数据库”)时,我必须首先找到类型为“数据库”的ID,然后查找所有指定此ID的CatalogObject。看起来有点乏味。

CatalogObject Table:
    ID, Name, Parent_ID (FK), TYPE_ID (FK)

Type Table: 
    ID, Type.

我已经使用CatalogObject和CatalogObjectType类创建了一个映射,但是CatalogObjectType类现在仅包含单个String。

public class CatalogObject implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "parent_id")
    CatalogObject parent;

    String name;

    @ManyToOne
    @JoinColumn(name = "type_id")
    CatalogObjectType type;
}

public class CatalogObjectType implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    Long id;

    String name;
}

我只想用关联类型的String值替换CatalogObjectType。如何为Hibernate / JPA配置它?能做到吗?

我想要的是:

public class CatalogObject implements Serializable {
    ...
    String name;

    @SomeAnnotation(name = "type_id")
    String type;
}

1 个答案:

答案 0 :(得分:0)

是的,您可以通过2个简单的步骤将实体映射到2个数据库表:

  1. 您需要使用JPA的@Table@SecondaryTable注释对实体进行注释,并提供第一张和第二张表的名称作为名称参数的值。
  2. 您需要使用@Column注释来注释要映射到辅助表的每个属性,并将辅助表的名称设置为表属性的值。

@Table注释定义默认情况下实体属性映射到的主表。 @SecondaryTable批注指定实体要映射到的第二个数据库表。

要做的就是将2个数据库表映射到一个实体。

您可以查看this link以获得带有示例的详细说明。