Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 从继承的实体调用JPA回调_Hibernate_Jpa - Fatal编程技术网

Hibernate 从继承的实体调用JPA回调

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

我有一个扩展AbstractProduct的SubscriptionProduct类

@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
是否有父类具有
(或
实体
)注释,并相应地创建多个日志,可以插入两个实体(一个用于子类,一个用于摘要)


希望这能有所帮助。

感谢您的回复。通过反射,我可以找到父类的表名,但如何才能找到父类中字段的值。对于表的每个条目,我希望保存到该表中的日志值。