EmbeddableId должен отображаться с помощью insert = "false" update = "false" - PullRequest
2 голосов
/ 02 мая 2019

У меня есть следующие сущности: Match с embeddableId MatchKey и полиморфной сущностью OrganisationMatch

Hibernate взрывается с Repeated column in mapping for entity: net.satago.web.entities.OrganisationMatch column: referenceKind (should be mapped with insert="false" update="false")

Я не знаю, чтонеправильно, я не могу использовать @DiscriminatorColumn аннотации на @EmbeddableId с деталях и сделать их не вставляемыми и не обновляемыми?

Это нормально работает, если столбец для различения не является частью @EmbeddableId, а простообычный столбец для сущности Match.

@Embeddable
@ParametersAreNonnullByDefault
public class MatchKey implements Serializable
{
    private static final long serialVersionUID = 7619427612022530146L;

    @Column(insertable = false, updatable = false)
    @Enumerated(STRING)
    private MatchableEntityKind referenceKind;

    private Long referenceId;

    public MatchKey()
    {
        // For JPA
    }

    public MatchKey(OrganisationId organisationId)
    {
        this.referenceKind = ORGANISATION;
        this.referenceId = organisationId.getId();
    }

    public MatchableEntityKind getReferenceKind()
    {
        return referenceKind;
    }

    public void setReferenceKind(MatchableEntityKind referenceKind)
    {
        this.referenceKind = referenceKind;
    }

    public Long getReferenceId()
    {
        return referenceId;
    }

    public void setReferenceId(Long referenceId)
    {
        this.referenceId = referenceId;
    }

    @Override
    public boolean equals(Object obj)
    {
        if (obj instanceof MatchKey)
        {
            MatchKey that = (MatchKey) obj;

            return this.referenceKind == that.referenceKind &&
                    Objects.equals(this.referenceId, that.referenceId);
        }

        return false;
    }

    @Override
    public int hashCode()
    {
        return Objects.hash(referenceKind, referenceId);
    }
}

@Entity
@Table(name = TABLE_NAME)
@Inheritance(strategy = SINGLE_TABLE)
@DiscriminatorColumn(name = "reference_kind", discriminatorType = DiscriminatorType.STRING)
@ParametersAreNonnullByDefault
public class Match implements EntityModel<MatchKey>
{
    static final String TABLE_NAME = "matches";

    @EmbeddedId
    private MatchKey id;

    @Version
    private Long version;

    ... generic match columns
}

и

@Entity
@DiscriminatorValue(OrganisationMatch.REFERENCE_KIND)
@ParametersAreNonnullByDefault
public class OrganisationMatch extends Match
{
    static final String REFERENCE_KIND = "ORGANISATION";

    @JoinColumn(name = "reference_id")
    @OneToOne(fetch = LAZY, optional = false)
    private Organisation organisation;

    public OrganisationMatch()
    {
        setReferenceKind(MatchableEntityKind.valueOf(REFERENCE_KIND));
    }

    public OrganisationMatch(OrganisationId organisationId)
    {
        super(new MatchKey(organisationId));
        setReferenceKind(MatchableEntityKind.valueOf(REFERENCE_KIND));
    }

    public Organisation getOrganisation()
    {
        return organisation;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...