Спящий режим, расширяющаяся сущность - «java.lang.IllegalArgumentException: неизвестная сущность» - PullRequest
0 голосов
/ 22 декабря 2018

У меня есть Hibernate Entity, BaseEvent, который прекрасно работает:

import javax.persistence.*;

@Entity
@Table(name = "base_event")
@SequenceGenerator(name = "seq", allocationSize = 1, sequenceName = "seq")
public class BaseEvent
{
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq")
    @Column(name = "id")
    protected Long id = null;

    @Column(name = "my_field", nullable = false)
    protected String myField;

    public Long getId()
    {
        return id;
    }

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

    public String getMyField()
    {
        return myField;
    }

    public void setMyField(final String myField)
    {
        this.myField = myField;
    }
}

Я хочу определить, когда этот объект изменяется, и обновить некоторое значение Map в моем приложении.Самый простой способ сделать это - расширить BaseEvent и переопределить установщик:

import java.text.MessageFormat;

public class ExtendedEvent extends BaseEvent
{
    @Override
    public void setMyField(final String myField)
    {
        System.out.println(MessageFormat.format("Setting myField to {0}", myField));
        super.setMyField(myField);
    }
}

Это прекрасно работает в моем приложении, но затем, когда я сохраняю сущность, Hibernate жалуется, что это не так.не знаю, что такое ExtendedEvent.

java.lang.IllegalArgumentException: Unknown entity: my.package.ExtendedEvent

Я вижу, что расширение Hibernate Entities является нетривиальной проблемой, особенно когда вы начинаете добавлять поля - но все, что я хочу, это чтобы Hibernate лечил ExtendedEvent как BaseEvent (потому что это так).Есть ли простое решение для этого?

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

Если вы хотите обновить карту только при обновлении изменений в хранилище данных, я бы порекомендовал реализовать onFlushDirty в перехватчике Hibernate .Этот метод вызывается всякий раз, когда сеанс сбрасывается в базу данных для каждого изменения объекта.Вы можете проверить тип объекта в методе onFlushDirty для своей сущности интереса и свойства интереса.

0 голосов
/ 22 декабря 2018

Сделать базовое событие @MappedSuperclass и расширяющий класс @Entity

так

@MappedSuperclass
public class BaseEvent

и

@Entity
@Table(whatever)
public class ExtendedEvent extends BaseEvent
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...