2011-11-18 67 views
0

我有一个类SubscriptionProduct extends AbstractProduct。从继承实体调用JPA回调

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

现在即使我期待两行之一subscriptionproduct,一个用于abstractproduct.Two次createLogAfterSave获取调用与SubscriptionProduct。

回答

0

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

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

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

希望这会有所帮助。

+0

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