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

Hibernate MappingExcture:外键必须与引用的主键具有相同的列数

谢海阳
2023-03-14

我有一个实体,叫做FatRabbitCarrot:

@Entity
public class FatRabbitCarrot {
    private Long id;
    private FatRabbit fatRabbit;
    private Carrot carrot;

@Id
@Column(name = "id", nullable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

@ManyToOne
@JoinColumn(name = "fatRabbit_id", foreignKey = @ForeignKey(name = "FK_FatRabbitCarrot_fatRabbit"))
public FatRabbit getFatRabbit() {
    return fatRabbit;
}

public void setFatRabbit(FatRabbit fatRabbit) {
    this.fatRabbit = fatRabbit;
}

@ManyToOne
@JoinColumn(name = "carrot_id", foreignKey = @ForeignKey(name = "FK_FatRabbitCarrot_carrot"))
public Carrot getCarrot() {
    return carrot;
}

public void setCarrot(Carrot carrot) {
    this.carrot = carrot;
}
}

而且很管用。现在上面的类已经替换了字段名,但是结构和我们的存储库是一样的。

然后我尝试添加一个新实体,该实体在上面的类中有一个外键。让我们把这门课叫做NutToffee。FatRabbitCarrot与这个新实体有一对一的关系,而实体本身应该有一对一的关系:

@Entity
public class NutToffee {

private Long id;
private String text;
private FatRabbitCarrot fatRabbitCarrot;

@Id
@Column(name = "id", nullable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long getId() {
    return id;
}

public void setId(Long id){
    this.id = id;
}

@Basic
@Column(name = "text")
public String getText() {
    return text;
}

public void setText(String text) {
    this.text = text;
}

@ManyToOne
@JoinColumn(name="fatRabbitCarrot_id", foreignKey = @ForeignKey(name = "FK_NutToffee_fatRabbitCarrot"))
public FatRabbitCarrot getFatRabbitCarrot() {
    return fatRabbitCarrot;
}

public void setFatRabbitCarrot(FatRabbitCarrot fatRabbitCarrot) {
    this.fatRabbitCarrot = fatRabbitCarrot;
}
}

对我来说,这似乎是一个有效的类。但看起来不像。我们正在使用Java8、Hibernate JPA 2.1、JavaEE 7和gradle来构建我们想要部署的工件。我们试图将其部署在Wildfly 10应用程序服务器上,但会出现以下错误:

[2019-07-08 03:53:45,441] Artifact Gradle : com.solveralynx.wildrunner : fatties.war: java.lang.Exception: {"WFLYCTL0080: Failed services" => {"jboss.persistenceunit.\"fatties.war#FatUnit\"" => "org.jboss.msc.service.StartException in service jboss.persistenceunit.\"fatties.war#FatUnit\": org.hibernate.MappingException: Foreign key (FK_NutToffee_fatRabbitCarrot:NutToffee [fatRabbitCarrot_id])) must have same number of columns as the referenced primary key (FatRabbitCarrot [fatRabbit_id,carrot_id])
Caused by: org.hibernate.MappingException: Foreign key (FK_NutToffee_fatRabbitCarrot:NutToffee [fatRabbitCarrot_id])) must have same number of columns as the referenced primary key (FatRabbitCarrot [fatRabbit_id,carrot_id])"},"WFLYCTL0412: Required services that are not installed:" => ["jboss.persistenceunit.\"fatties.war#FatUnit\""],"WFLYCTL0180: Services with missing/unavailable dependencies" => undefined}

据我所知,Hibernate为FatRabbitCarrot找到了一个复合主键?即使我们从未定义过一个?它似乎拾取了一个伪主键,它使用实体FatRabbitCarrot的两个外键。

至于我的测试。我相信这是一个Hibernate问题。无论数据库状态如何,我都会遇到此错误。我在连接实体的getter上测试了各种参数,但没有成功。如果我同时移除新的OneToMany和ManyToOne连接,工件就会展开。

有人知道Hibernate为什么要这么做吗?

共有1个答案

徐嘉勋
2023-03-14

您使用的@JoinColumn批注不正确。

@Entity
public class FatRabbitCarrot {

    @Id
    @GeneratedValue
    private Long id;

    @OnToMany
    private List<NutToffee> toffies;

}

@Entity
public class NutToffee {

    @Id
    @GeneratedValue
    private Long id;

    @ManyToOne
    @JoinColumn(name = "fatRabbitCarrot_id")
    private FatRabbitCarrot fatRabbitCarrot;

}

这意味着您将使用联接表在FatRabbitCarrotNutToffee之间建立关联。a您将在NutToffee表中增加一个fatRabbitCarrot\u id列。

您需要使用mappedBy

    @Entity
    public class FatRabbitCarrot {

        @Id
        @GeneratedValue
        private Long id;

        @OnToMany(mappedBy = "fatRabbitCarrot")
        private List<NutToffee> toffies;

    }

    @Entity
    public class NutToffee {

        @Id
        @GeneratedValue
        private Long id;

        @ManyToOne
        @JoinColumn(name = "fatRabbitCarrot_id")
        private FatRabbitCarrot fatRabbitCarrot;

    }

如果您不需要@ManyToOne关联,可以将@JoinColumn@OneToMany一起使用,而不使用mappedBy

    @Entity
    public class FatRabbitCarrot {

        @Id
        @GeneratedValue
        private Long id;

        @OnToMany
        @JoinColumn(name = "fatRabbitCarrot_id")
        private List<NutToffee> toffies;

    }

    @Entity
    public class NutToffee {

        @Id
        @GeneratedValue
        private Long id;


    }

https://stackoverflow.com/a/37542849/3405171

 类似资料:
  • 我知道这个主题在这里讨论了很多次,但我仍然坚持一个例外:外键必须与引用的主键具有相同的列数。 (我正在使用spring数据和hibernate) 我的身份证类别: 我的实体: 对于这种构造,我得到以下例外情况: 导致:org.hibernate.MappingException:外键(FK_ad3h9gu4labg6ix34bei3poxt:proxy_dienst_关系[parent_diens

  • 我有域类 - 用户、角色、组、组角色 用户域 用户.hbm.xml 我有user_grouprole表作为一个连接表为一个用户和一组分组程序我有user_role表作为一个连接表为一个用户和一组角色 组域 Group.hbm.xml 组角色 GroupRole.hbm.xml 当我尝试使用主类进行测试时,我得到了一个映射错误,比如Hibernate映射错误,比如外键(FK5110401A83989

  • 问题内容: 目标:我想在ImportJob中使用importJobId作为分配表ID的外键,这样,当我们那时具有importJobId时,那么我们只能在ID中分配ID,因为没有Job时就无法进行任何分配。 ImportJob表的复合主键为[ORGID,IMPORTJOBTYPE],正在尝试使用以下方式在hibernate状态下创建外键关系: 在Allocation.hbm.xml中无法解决,并收到

  • 嗨,下面是我的实体,它们之间有许多联系 大学生JAVA 学生详细信息。JAVA appmain.java 下面是我的2表中的列 “学生详细信息”中的“值”应输入学生表的“用户角色” 但当我执行appmain时,我的错误率就降低了 我试图解决这个问题,但它显示出同样的错误请建议我如何解决这个问题

  • 问题内容: 目标:我想在ImportJob中使用importJobId作为分配表ID的外键,这样,当我们那时具有importJobId时,那么我们只能在ID中分配ID,因为没有Job时就无法进行任何分配。 ImportJob表的复合主键为[ORGID,IMPORTJOBTYPE],正在尝试使用以下方式在休眠状态下创建外键关系: 在Allocation.hbm.xml中无法解决,并收到以下错误消息:

  • 我在实体和之间有多对多的关系,我使用了一个名为的关联表。 AbstractEntity.java: FunctionEntity.java: FunctionProduceResultEntity.java: ResultEntity.java 功能实用性: 启动服务器时,出现以下错误: 还有类似的问题,例如外键必须具有与多对一映射中引用的主键相同的列数,以及Hibernate MappingEx