当前位置: 首页 > 面试题库 >

具有2个主键字段的JPA表

公西翼
2023-03-14
问题内容

我有一个仅包含2个字段的表。该表具有由这两个字段形成的复合PK。

使用Netbeans从数据库创建实体bean时,不会像其他具有两个以上字段的表那样自动创建实体bean。

所以我想我需要自己创建实体bean。创建此实体bean的最佳实践是什么?是否必须包含COMPOSITE KEY对象?


问题答案:

我不使用NetBeans,因此我不能说任何有关其映射工具的信息。

要映射组合键,有两个选项。您可以

  • @Embeddable用PK字段定义一个单独的对象,并像@EmbeddedId@Entity课堂上一样使用它
        @Embeddable
    public class MyCompositePK { 
        @Column
        private String fieldA;
        @Column
        private String fieldB;
    }
    @Entity 
    public class MyBean { 
        @EmbeddedId
        private MyCompositePK id;
        @Column
        private String fieldC;
    }
  • 使用PK字段定义一个未映射的POJO并像@IdClass中一样使用它@Entity
        @Entity
    @IdClass(value=ClassAB.ClassABId.class)
    public class ClassAB implements Serializable {
        private String idA;
        private String idB;

        @Id
        @Column(name="ID_A")
        public String getIdA(){ return idA; }
        public void setIdA(String idA){ this.idA = idA; }

        @Id
        @Column(name="ID_B")
        public String getIdB(){ return idB; }
        public void setIdB(String idB){ this.idB = idB; }

        static class ClassABId implements Serializable {
            private String idA;
            private String idB;

            public String getIdA(){ return idA; }
            public void setIdA(String idA){ this.idA = idA; }

            public String getIdB(){ return idB; }
            public void setIdB(String idB){ this.idB = idB; }

            // implement equals(), hashcode()
        }
    }

在此示例ClassABId中,为方便起见,使用了一个静态内部类。

Pascal
Thivent对以下问题的出色回答也解释了这些选项:如何使用Hibernate映射组合键?。

这个相关问题讨论了这些方法之间的差异:我应该使用哪种注释:@IdClass或@EmbeddedId。注意,该@IdClass方法重复了字段的声明。

无论如何,我认为创建两个类没有其他选择。这就是为什么我问这个问题:映射仅包含复合PK而没有@IdClass或@EmbeddedId的类。似乎有一个特定于休眠的功能。

附带说明一下,如果您可以控制数据库结构,则还可以考虑避免使用复合键。这样做有一些原因。



 类似资料:
  • 问题是@ManyToOne@Joincolumn ID_REPORT(它是一个主键)和@Joincolumn ID_TEMPLATE_DEFAULT 实体映射中的重复列:CurReport 列:id_report(应使用插入=“false”更新=“false”进行映射) 代码 第一桌CUR_TEMPLATE 第二个表CUR_REPORTS 第一个表CUR_REPORTS实体当前报表 第二个表CUR

  • 问题内容: 只是为了扩展我以前的问题-我的数据库中有两个表,我想提取某些信息。下表: 您向我提供了以下代码来获取播放器的名称: 效果很好,谢谢-我只想进行两项调整: 我想返回得分手的名字以及球员的名字。由于m.scorer是一个ID,如果p.Name已被映射到m.playerID,我如何将其映射到p.Name属性? 上面的查询返回所有玩家的姓名。我很快就会添加搜索功能,您可以在其中搜索特定玩家的所

  • 问题内容: 我正在尝试创建一个标准来从3个表(关联,更新和详细信息)中检索一些对象。详细信息引用了关联和更新,而更新引用了详细信息列表。我的目标是在给定关联ID的情况下,在指定字段中检索至少包含明细且值为空的更新列表。在JPQL中很容易做到,但是客户说必须用标准编码。 我的JPQL是: 我尝试了以下操作,但是它只是返回了数据库中的所有更新: 谁能帮我?我搜索了但找不到3个实体的任何示例。 问题答案

  • 我在oracle数据库中有一个包含客户数据的表。以下是一个简化的定义: 此表的主键是。 该表有许多行,其中为空。在数据库级别,没有问题,但是当我试图通过JPA实体访问这些行时,会导致一些问题: 1:使用

  • 我有一个实体,它的复合主键由两个字段组成,其中一个也是复合外键的一部分。 背景:我有实体<代码>人员 、<代码>区域 和<代码>会话 。 与具有多对多关系,使用称为“和实体。 所以,我有,主键为(,)。本身是的外键。 也有一个字段。我希望(,)是的复合外键。 我的PersonSession代码: } 这看起来不错,它在数据库中创建了所有正确的关系。当我尝试插入个性化会话对象时,问题就出现了——ar

  • 问题内容: 这是场景: 我有2个数据表,一个是2009年版本,另一个是2010年版本。每个表的主键是组合键。我知道每一行都有不同数量的行,我需要找出差异。 通常,在“常规”主键设置中,我只会在其他表的主键列表中查找主键值。但是我不知道如何使用复合主键(甚至是可能的话)执行此操作。 那么,如何比较这两个表中的行呢? 编辑:更具体地说,我试图找到表之间的 差异 ,而不是共同的行 问题答案: 只需使用基