Hibernate 从继承的实体调用JPA回调
我有一个扩展AbstractProduct的SubscriptionProduct类Hibernate 从继承的实体调用JPA回调,hibernate,jpa,Hibernate,Jpa,我有一个扩展AbstractProduct的SubscriptionProduct类 @Entity @Table(name = "AbstractProduct") @EntityListeners(Auditable.class) @Inheritance(strategy = InheritanceType.JOINED) public abstract class AbstractProduct implements Serializable{ int code; } @Ent
@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的EntityListenerclass
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调用CreateLogAfSave。即使您的注释放在abstractproduct上,您也在保存一个具体类的实例 代码
O.getClass()
返回对象的具体类型,无论注释位于何处。然后,您将获得对SubscriptionProduct
的两次引用。这解释了您遇到的行为
通过删除其中一个注释,可以避免让侦听器执行两次。通过使用反射手动检查对象O
是否有父类具有表
(或实体
)注释,并相应地创建多个日志,可以插入两个实体(一个用于子类,一个用于摘要)
希望这能有所帮助。感谢您的回复。通过反射,我可以找到父类的表名,但如何才能找到父类中字段的值。对于表的每个条目,我希望保存到该表中的日志值。