我有一个类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。
答案 0 :(得分:0)
即使您的注释放在AbstractProduct上,您也要保存具体类的实例。
代码O.getClass()
返回对象的具体类型,无论注释位于何处。然后,您将两次引用SubscriptionProduct
。这解释了您遇到的行为。
您可以通过删除其中一个注释来避免让侦听器执行两次。您可以通过手动检查对象O
是否具有使用反射Table
(或Entity
)注释的父类来插入两个实体(一个用于子类,一个用于抽象) ,并相应地创建多个日志。
希望这有帮助。