Hibernate выбрасывает исключение classcast для @JoinFormula не может привести к @Column.Как я могу решить это? - PullRequest
0 голосов
/ 18 мая 2019

Я работаю над существующим проектом весенней загрузки.Сущность приложения сотрудника сопоставлена ​​с 78 другими объектами.У каждой сущности есть составной ключ.Когда я запускаю проект, я получаю сообщение об ошибке здесь: -

  @ManyToOne
  @JoinColumns({
  @JoinColumn(name="COMPANYID", referencedColumnName="COMPANYID", insertable=false, updatable=false),
  @JoinColumn(name="COMPANYFIRM", referencedColumnName="COMPANYFIRM")  })
  private Firm firm;

Firm.java

public class Firm
  implements Serializable
{

  @EmbeddedId
  private FirmID firmID;

  private String description;
}

FirmID.java

package com.nicholas.jpa;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Embeddable;

@Embeddable
public class FirmID
    implements Serializable
{
  @Column(name="COMPANYID")
  private int id;

  @Column(name="COMPANYFIRM")
  private String name;

  public FirmID()
    {
    }

    public FirmID(int id, String name)
    {
        this.id = id;
        this.name = name;
    }

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public int getId()
    {
        return id;
    }

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

    public int hashCode()
    {
        return name.hashCode();
    }

    @Override
    public String toString()
    {
        return String.format("%d-%s", id, name);
    }

    public boolean equals(Object obj)
    {
        if (obj == this)
            return true;
        if (obj == null)
            return false;
        if (!(obj instanceof FirmID))
            return false;

        FirmID pk = (FirmID) obj;
        return pk.id == id && pk.name.equals(name);
    }
}

Ошибка: -

Причина: org.hibernate.AnnotationException: Смешивание вставляемых и не вставляемых столбцов в свойстве не допускается: com.nicholas.jpa.Employee.firm в org.hibernate.cfg.Ejb3Column.checkPropertyConsistency (Ejb3Column.java:718) ~ [hibernate-core-5.2.16.Final.jar: 5.2.16.Final] в org.hibernate.cfg.AnnotationBinder.bindManyToOne (AnnotationBinder.java:3035) ~ [hibernate-core-5.2.16.Final.jar: 5.2.16.Final] at org.hibernate.cfg.AnnotationBinder.processElementAnnotations (AnnotationBinder.java:1776) ~ [hibernate-core-5.2.16.Final.jar: 5.2.16.Final]в org.hibernate.cfg.AnnotationBinder.processIdPropertiesIfNotAlready (AnnotationBinder.java:924) ~ [hibernate-core-5.2.16.Final.jar: 5.2.16.Final] в org.hibernate.cfg.AnnotationBinder.bindClass (аннотация.Java: 751) ~ [hibernate-core-5.2.16.Final.jar: 5.2.16.Final]

Я решилэто с помощью Должна ли Hibernate обрабатывать перекрывающиеся внешние ключи?

@ManyToOne(optional = true)
@JoinColumnsOrFormulas(value = {
        @JoinColumnOrFormula(formula = @JoinFormula(referencedColumnName = "COMPANYID", value = "COMPANYID")),
        @JoinColumnOrFormula(formula = @JoinFormula(referencedColumnName = "COMPANYFIRM", value = "COMPANYFIRM"))})
private Firm firm;

Теперь ошибка выше исчезла, поэтому я должен заменить все @JoinColumns на @JoinColumnsOrFormulas.В конце я столкнулся с ClassCastException

. Вызвано: java.lang.ClassCastException: org.hibernate.mapping.Formula не может быть приведен к org.hibernate.mapping.Column в org.hibernate.cfg..annotations.TableBinder.bindFk (TableBinder.java:584) ~ [hibernate-core-5.2.16.Final.jar: 5.2.16.Final] at org.hibernate.cfg.annotations.CollectionBinder.bindCollectionSecondPass (CollectionBinder.java:1627) ~ [hibernate-core-5.2.16.Final.jar: 5.2.16.Final] в org.hibernate.cfg.annotations.CollectionBinder.bindOneToManySecondPass (CollectionBinder.java:881) ~ [hibernate-core-5.2.16.Final.jar: 5.2.16.Final] в org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass (CollectionBinder.java:796) ~ [hibernate-core-5.2.16.Final.jar: 5.2.16.Final]в org.hibernate.cfg.annotations.CollectionBinder $ 1.secondPass (CollectionBinder.java:735) ~ [hibernate-core-5.2.16.Final.jar: 5.2.16.Final] в org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:54) ~ [hibernate-core-5.2.16.Final.jar: 5.2.16.Final]

Поскольку я уже упоминал, что существует множество сущностей, и я проверил каждую сущность с каждой строкой, ошибки нет.Сущность под названием EntryExit.java является последней сущностью, которая заменит @JoinColumns, если я заменю их, тогда это ClassCastException выбрасывает другое мудрое старое исключение: «Смешение вставляемых и не вставляемых столбцов в свойстве недопустимо».

Я проверил следующие ответы, но, похоже, ничего не работает в моем случае: -

  1. hibernate @JoinColumnsOrFormulas throws Формула не может быть приведена к исключению столбца

  2. Hibernate и @JoinFormula: org.hibernate.mapping. Формула не может быть приведена к org.hibernate.mapping.Column

  3. https://hibernate.atlassian.net/browse/HHH-10897

Пожалуйста, предложите мне, если есть другой подход для сопоставления @ManyToOne с составным ключом или решением в существующем подходе.Я жду вашей помощи ..!

...