当前位置: 首页 > 知识库问答 >
问题:

JPA:具有复合主键和单键的实体映射

华和悦
2023-03-14

JPA 2,Hibernate 4。

从数据库视图创建实体。我很难让这两个实体正确地映射。我有一个具有复合键的父实体和一个具有单个值键的子实体。

两者之间的关系由具有父级复合键的一部分的子实体定义。试图将两者联系起来。

复合键类

@Embeddable
public Class ParentID implements Serializable {

    private static final long serialVersionUID = 1L;

    private long keyIdOne;
    private String keyIdTwo;
    ....
}
@Entity
public class Parent {
    @EmbeddedId
    protected ParentID id;
    ....

    @OneToMany
    private List<Child> childList;
}
@Entity
public class Child {
    @Id
    private long Id;

    private long keyIdOne //FK to part of the parentId composite key
    .....


    @ManyToOne
    private Parent parent;
}
@ManyToOne
@JoinColumn(name="keyIdOne", referencedColumnName="keyIdOne") 
private Parent parent;

任何帮助都是非常感谢的。

共有1个答案

轩辕煌
2023-03-14

我认为这个问题的问题在于PK-FK(主键-外键)约束。

总之:

Parent:
| keyIdOne | keyIdTwo |
|----------|----------|
|    1     |    a     |
|    1     |    b     |
|    3     |    a     |

Child:
| id | keyIdOne |
|----|----------|
| 2  |    1     |
| 3  |    3     |

外键必须引用它所引用的表(http://en.wikipedia.org/wiki/foreign_key)中的一行。如果子级的keyidone=1引用父级中的哪一行Child.keyidone

Parent:
| keyIdOne |
|----------|
|    1     |
|    3     |

Child:
| keyIdOne | keyIdTwo |
|----------|----------|
|    1     |    a     |
|    1     |    b     |
|    3     |    a     |

在这种情况下,您可以使用以下方法将子项的复合键的一部分映射到父项:

@MapsId("keyIdOne")
private Parent parent;

@Mapsid只在OnetoOne和ManyToOne中工作(http://docs.oracle.com/javaee/6/api/javax/persistence/mapsid.html)

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

  • 我有两个表:A和B,都有一个复合主键。表B的PK也是表a主键的外键。 当我试图获取映射表B的类的实例时,我得到了以下异常: org.hibernate.TypeMismatchException 这两个类都位于package:com.cairone.ejemple01.entities 完整的日志输出为: 2016-09-21 12:28:24.505错误8568--[main] O.S.Boot

  • 我有一个JPA实体的类层次结构,基类是定义了一个ID的MappedSuperclass。我试图在子类中使用复合键,但这似乎不起作用

  • 我的数据库是: 我们可以在Table2中为Table1中的1设置多行。 我的TABLE1实体是: 我的Table1Id类是: 我的TABLE2实体是: 我的Table2Id类是: 当我尝试启动我的tomcat时,我有以下错误: 我尝试使用引用列,主键连接列和许多其他东西,但是通过在互联网上阅读它,它可以解决数据库建模问题。我认为问题是主键和外键在2个表中具有相同的名称,但我可能是错的......我

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

  • 我有2个表,即user和user_session。

  • 问题内容: 我的JPA模型中有以下类(省略了getters,setters和无关字段): 我需要定义一个类,使得当从所述类生成DDL时,相应的表的主键被由密钥和。我尝试了以下方法: 但这会为表生成以下内容: 请注意,和都是可为空的,当我尝试将DDL加载到SQL Server时会导致以下错误 无法在表“ PRICE”中的可为空的列上定义PRIMARY KEY约束 我不明白为什么这些可以为空,因为在域

  • 异常[EclipseLink-48](Eclipse Persistence Services-2.3.2.v20111125-r10461):org.Eclipse.Persistence.exceptions.Description异常描述:字段[flight.connid]存在多个可写映射。只有一个可以定义为可写,所有其他的都必须指定为只读。映射:org.eclipse.persistenc