Вызов обратных вызовов JPA от унаследованных объектов - PullRequest
0 голосов
/ 19 ноября 2011

У меня есть класс SubscriptionProduct, расширяющий AbstractProduct.

@Entity
@Table(name = "AbstractProduct")
@EntityListeners(Auditable.class)
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class AbstractProduct  implements Serializable{
  int code;

}

@Entity
@EntityListeners(Auditable.class)
@Table(name="SubscriptionProduct")
public class SubscriptionProduct extends AbstractProduct {
  String description    
}

Я хочу создать запись в журнале всякий раз, когда создается объект. Я написал EntityListenerclass под названием Auditable.class

public class Auditable {


    @PostPersist
    public void createLogAfterSave(Object O) {

        Session session = createLocalSession();     
        ActivityLog log = new ActivityLog();            
        log.setTablename(O.getClass().getAnnotation(Table.class).name());
        log.setNewValue(O.toString());
        log.setOperation("Create");         
        log.setOldValue(" ");       
        session.save(log);
    }
}

Теперь, несмотря на то, что я ожидаю две строки, одну для продукта подписки и одну для продукта абстракции. Дважды создается метод createLogAfterSave с SubscriptionProduct.

1 Ответ

0 голосов
/ 19 ноября 2011

Даже если ваша аннотация помещена в AbstractProduct, вы сохраняете экземпляр конкретного класса.

Код O.getClass() возвращает конкретный тип объекта, независимо от того, где находится аннотация.Затем вы дважды получаете ссылку на SubscriptionProduct.Это объясняет поведение, с которым вы сталкиваетесь.

Вы можете избежать выполнения слушателя дважды, удалив одну из аннотаций.И вы можете вставить две сущности (одну для подкласса, одну для абстрактной), проверив вручную, есть ли у объекта O родительский класс с аннотацией Table (или Entity) с использованием отражения, и создав несколько журналов соответственно..

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...