从继承的实体调用JPA回调

时间:2011-11-18 20:34:13

标签: hibernate jpa

我有一个类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    
}

我想在创建实体时创建日志条目。 我写了一个名为Auditable.class的EntityListener类

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);
    }
}

现在即使我期待两个一行用于subscriptionproduct,一个用于abstractproduct。两次使用SubscriptionProduct调用createLogAfterSave。

1 个答案:

答案 0 :(得分:0)

即使您的注释放在AbstractProduct上,您也要保存具体类的实例。

代码O.getClass()返回对象的具体类型,无论注释位于何处。然后,您将两次引用SubscriptionProduct。这解释了您遇到的行为。

您可以通过删除其中一个注释来避免让侦听器执行两次。您可以通过手动检查对象O是否具有使用反射Table(或Entity)注释的父类来插入两个实体(一个用于子类,一个用于抽象) ,并相应地创建多个日志。

希望这有帮助。