Java org.hibernate.MappingException:外键(FK12A71396964CA10:)必须与引用的主键具有相同的列数

Java org.hibernate.MappingException:外键(FK12A71396964CA10:)必须与引用的主键具有相同的列数,java,hibernate,foreign-keys,Java,Hibernate,Foreign Keys,我的Java代码中的Netbeans出现以下错误: org.hibernate.MappingException: Foreign key (FK12A711396456CA10:devolucion_master [devolucion_consecutivo])) must have same number of columns as the referenced primary key (devolucion [detalle_ticket_id,detalle_ticket_ticket

我的Java代码中的Netbeans出现以下错误:

org.hibernate.MappingException: Foreign key (FK12A711396456CA10:devolucion_master [devolucion_consecutivo])) must have same number of columns as the referenced primary key (devolucion [detalle_ticket_id,detalle_ticket_ticket_id,detalle_ticket_fondo_fijo_id,detalle_ticket_caja_id,consecutivo] 
我从DevLucionMaster到DevLucion创建了一个外键,使用DevLucion的“Concertivo”到DevLucionMaster的变量“Concertivo”,问题是对于DevLucion,“key”是复合键,我只对外键使用键的一个元素,这可能就是为什么(需要使用构成主键的5)

以下是DevLucionMaster.hbm.mxl:

<hibernate-mapping>
  <class catalog="pos" name="dunosusa.pos.model.DevolucionMaster" table="devolucion_master">
    <composite-id class="dunosusa.pos.model.DevolucionMasterId" name="id">
      <key-property name="id" type="int">
        <column name="id"/>
      </key-property>
      <key-property name="detalleTicketTicketId" type="int">
        <column name="detalle_ticket_ticket_id"/>
      </key-property>
      <key-property name="detalleTicketFondoFijoId" type="int">
        <column name="detalle_ticket_fondo_fijo_id"/>
      </key-property>
      <key-property name="detalleTicketCajaId" type="int">
        <column name="detalle_ticket_caja_id"/>
      </key-property>
    </composite-id>
    <many-to-one class="dunosusa.pos.model.Devolucion" fetch="select" name ="devolucion">
      <column name="devolucion_consecutivo" not-null="true"/>
    </many-to-one>
    <many-to-one class="dunosusa.pos.model.Usuario" fetch="select" name="usuario">
      <column length="6" name="usuario_clave_autorizo"/>
    </many-to-one>
    <many-to-one class="dunosusa.pos.model.Ticket" fetch="select" insert="false" name="ticket" update="false">
      <column name="detalle_ticket_ticket_id" not-null="true"/>
      <column name="detalle_ticket_fondo_fijo_id" not-null="true"/>
      <column name="detalle_ticket_caja_id" not-null="true"/>
    </many-to-one>
    <property name="total" type="big_decimal">
      <column name="total" not-null="true" precision="10"/>
    </property>
    <property name="fecha" type="timestamp">
      <column length="19" name="fecha"/>
    </property>
  </class>
</hibernate-mapping>
java:(与DevLucionMaster相同)

我不知道我的错误是什么,我在网上搜索过类似的错误,但我读过的解决方案没有一个奏效(请原谅我的英语不好)


非常感谢

是的,您有一个用于
Devolucion
类的复合主键,并且您正试图通过一个简单的列/字段
Devolucion\u master.Devolucion\u continuTIVO
来引用它

我不知道有什么方法可以轻易地告诉Hibernate,
DevLucion\u Concertivo
列实际上是
Dunousa.pos.model.DevLucionid
类型

这就是为什么我从未使用过复合主键。我总是有一个类型为
Long
bigint
)的主键,并在需要时强制外键组合的唯一性。它更容易处理,没有像你现在这样的问题

附录: 我只是做了一些挖掘,事实上,有一种方法可以做到:-) 但正如我所说的,它不像使用单列PK/FK键那么简单

与此相反:

<hibernate-mapping>
  <class catalog="pos" name="dunosusa.pos.model.DevolucionMaster" table="devolucion_master">
  ...
    <many-to-one class="dunosusa.pos.model.Devolucion" fetch="select" name="devolucion">
      <column name="devolucion_consecutivo" not-null="true"/>
    </many-to-one>
    ...

...
...
您应该像下面这样列出FK中的所有PK列:

<hibernate-mapping package="dunosusa.pos.model">
  <class catalog="pos" name="DevolucionMaster" table="devolucion_master">
    ...
    <many-to-one class="Devolucion" fetch="select" name="devolucion">
      <column name="devolucion_detalle_ticket_id" not-null="true"/>
      <column name="devolucion_detalle_ticket_ticket_id" not-null="true"/>
      <column name="devolucion_detalle_ticket_fondo_fijo_id" not-null="true"/>
      <column name="devolucion_detalle_ticket_caja_id" not-null="true"/>
      <column name="devolucion_consecutivo" not-null="true"/>
    </many-to-one>
    ...

...
...
一点建议-使用
hibernate映射
元素的
package
属性,这样您就不必在任何地方都键入它-它使它更具可读性


祝您好运。

是的,您有一个用于
DevLucion
类的复合主键,并且您正试图通过一个简单的列/字段
DevLucion\u master.DevLucion\u continuTIVO来引用它

我不知道有什么方法可以轻易地告诉Hibernate,
DevLucion\u Concertivo
列实际上是
Dunousa.pos.model.DevLucionid
类型

这就是为什么我从未使用过复合主键。我总是有一个类型为
Long
bigint
)的主键,并在需要时强制外键组合的唯一性。它更容易处理,没有像你现在这样的问题

附录: 我只是做了一些挖掘,事实上,有一种方法可以做到:-) 但正如我所说的,它不像使用单列PK/FK键那么简单

与此相反:

<hibernate-mapping>
  <class catalog="pos" name="dunosusa.pos.model.DevolucionMaster" table="devolucion_master">
  ...
    <many-to-one class="dunosusa.pos.model.Devolucion" fetch="select" name="devolucion">
      <column name="devolucion_consecutivo" not-null="true"/>
    </many-to-one>
    ...

...
...
您应该像下面这样列出FK中的所有PK列:

<hibernate-mapping package="dunosusa.pos.model">
  <class catalog="pos" name="DevolucionMaster" table="devolucion_master">
    ...
    <many-to-one class="Devolucion" fetch="select" name="devolucion">
      <column name="devolucion_detalle_ticket_id" not-null="true"/>
      <column name="devolucion_detalle_ticket_ticket_id" not-null="true"/>
      <column name="devolucion_detalle_ticket_fondo_fijo_id" not-null="true"/>
      <column name="devolucion_detalle_ticket_caja_id" not-null="true"/>
      <column name="devolucion_consecutivo" not-null="true"/>
    </many-to-one>
    ...

...
...
一点建议-使用
hibernate映射
元素的
package
属性,这样您就不必在任何地方都键入它-它使它更具可读性


祝你好运。

那么,嗯@Cebence,解决这个问题的最好方法就是从
DevLucionMaster
中删除外键?只需将其保留为一个简单的列
devolucion\u continuTIVO
?但是,在DB表
devolucion\u master
中,我只检查了作为外键的列
continuTIVO
。。。如果我是对的,使用您给出的解决方案,我必须标记或检查其他4个元素,这4个元素构成了
转移
表的键,对吗?是的,您需要将PK中的所有列都放在FK中。否则,您如何仅使用3列FK识别表中具有例如4列PK的行?(或您的案例中的一列)。但是,如果
devolucion.conceutivo
可以唯一地识别一行,那么您就不需要
devolucion
PK中的所有其他列。非常感谢您,我非常感谢您的帮助和您的时间:)您每天都从那些有知识的人那里学到很多。因此,嗯@Cebence,解决此问题的最佳方法是从DevLucionMaster中删除外键?只需将其保留为一个简单的列
devolucion\u continuTIVO
?但是,在DB表
devolucion\u master
中,我只检查了作为外键的列
continuTIVO
。。。如果我是对的,使用您给出的解决方案,我必须标记或检查其他4个元素,这4个元素构成了
转移
表的键,对吗?是的,您需要将PK中的所有列都放在FK中。否则,您如何仅使用3列FK识别表中具有例如4列PK的行?(或您的案例中的一列)。但是,如果
devolucion.conceutivo
可以唯一地识别一行,那么您就不需要
devolucion
PK中的所有其他列。非常感谢您,我真的非常感谢您的帮助和您的时间:)每天您都从那些有知识的人那里学到很多东西。
<hibernate-mapping package="dunosusa.pos.model">
  <class catalog="pos" name="DevolucionMaster" table="devolucion_master">
    ...
    <many-to-one class="Devolucion" fetch="select" name="devolucion">
      <column name="devolucion_detalle_ticket_id" not-null="true"/>
      <column name="devolucion_detalle_ticket_ticket_id" not-null="true"/>
      <column name="devolucion_detalle_ticket_fondo_fijo_id" not-null="true"/>
      <column name="devolucion_detalle_ticket_caja_id" not-null="true"/>
      <column name="devolucion_consecutivo" not-null="true"/>
    </many-to-one>
    ...