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

具有复合主键和外键的JPA实体

孟彦
2023-03-14

我有一个实体,它的复合主键由两个字段组成,其中一个也是复合外键的一部分。

背景:我有实体<代码>人员 、<代码>区域 和<代码>会话

人员区域和会话具有多对多关系,使用称为人员区域“和”人员会话“的联接实体。

所以,我有人员会话,主键为(人员 Id会话 ID)。“人员标识”和“会话 Id”本身是“人员和会话”的外键。

角色会话也有一个字段areaId。我希望(角色IDareaId)是角色区域的复合外键。

我的PersonSession代码:

@Entity
@Table(name="person_session")
@IdClass(PersonSession.ID.class)
public class PersonSession {

  @Id
  private int personId ;

  @Id
  private int sessionId;

  @ManyToOne
  @JoinColumn(name = "personId", updatable = false, insertable = false, referencedColumnName = "id")
  private Person person;

  @ManyToOne
  @JoinColumn(name = "sessionId", updatable = false, insertable = false, referencedColumnName = "id")
  private Session session;

  @ManyToOne//(cascade = CascadeType.ALL)
  @JoinColumns({
    @JoinColumn(name = "personId", updatable = false, insertable = false),
    @JoinColumn(name = "areaId", updatable = false, insertable = false),
  })
  private PersonArea personArea;

}

PersonSession.Id 代码

public static class ID implements Serializable {
    private int personId;
    private int sessionId;
}

这看起来不错,它在数据库中创建了所有正确的关系。当我尝试插入个性化会话对象时,问题就出现了——areaId列总是空的,我想这是因为它定义了一个updatable=false, addtable=false

但是,如果我试图使它可更新和可插入,我会得到一个异常,抱怨personId是一个重复的列:

Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: foo.bar.PersonSession column: personId (should be mapped with insert="false" update="false")

我怎样才能拥有所需的关系并使areaId可更新和可插入?

共有2个答案

袁华清
2023-03-14

我知道我迟到了,但是我面临着同样的问题,我使用@JoinColumnsOrFormulas来解决它。你可以这样做:

@JoinColumnsOrFormulas(value = {
        @JoinColumnOrFormula(column = @JoinColumn(name="personId", referencedColumnName = "personId")),
        @JoinColumnOrFormula(formula = @JoinFormula(value="areaId", referencedColumnName = "areaId"))}) 
private PersonArea personArea;
朱翔
2023-03-14

我应该能够用这个做我想做的事:

@ManyToOne//(cascade = CascadeType.ALL)
@JoinColumns({
  @JoinColumn(name = "personId"),
  @JoinColumn(name = "areaId", updatable = false, insertable = false),
})
private PersonArea personArea;

但Hibernate不支持混合使用可更新和不可更新的联接列。这个问题的公认答案表明,它可能会在某个时候得到支持,但开发人员似乎并不十分担心这个缺点。

我有如何抛弃冬眠,转而支持日食链接,它的工作原理!

 类似资料:
  • 我有两个表: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

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

  • 问题 如果我像下面的例子一样使用属性访问类型,我是否也必须为引用的FK定义getter和setter? 我不认为是这样,但Java EE6的官方文档是这样做的。 null

  • 我为这个特殊的问题找了很多,但我没有找到任何具体的解决办法。我在一个表中有一个复合主键,这个复合主键的一个字段是另一个表的复合主键的一部分。您可以说这个特定的字段是第二个表中的外键,但是在表定义中没有定义任何独占外键约束。对于第一个表中的每个rec,第二个表中可能有多条记录。我试图使用SPringBoot-JPA-Hibernate实现这一点,但无法实现。有人能帮我吗。以下是德泰:- 我有一个US

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

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