2011-12-26 53 views
9

我试图设置我的休眠应用程序来坚持一个新的Notification实体每次创建一个Activity实体 - 目前,我已经尝试Notification只是无法坚持保持沉默(日志中没有错误,但sql永远不会执行) 。是否有可能在@ Pre/PostPersist监听器中保留新的实体?

任何人都可以确认它甚至可以在Hibernate pre/postPersist侦听器中保留额外的实体吗?

我已阅读的文档中:

回调方法不能调用EntityManager的或查询方法!

但我已经阅读了几个似乎表明这是可能的讨论主题。

仅供参考,我已经尝试了两种方法:

  1. @PrePersist方法 - 设置ActivityNotification之间的cascade.ALL关系,并在PrePersist方法简单地创建一个新的Notification并将其链接到Activity被创建,希望Notification将被持续。

  2. @PostPersist方法 - 使用@Configurable,并在服务ListenerClass,布线和创建新的Notification实体,然后显式调用entityManger一直存在

有人可以证实我想什么是可能的?

回答

1

为什么你必须坚持Notification@PrePersist@PostPersist函数?下面的代码应该坚持两个实体:

@Entity 
public class Activity implements Serializable { 
    @OneToOne(cascade={CascadeType.PERSIST}) 
    private Notification notification; 
} 

@Entity 
public class Notification implements Serializable { } 

@Stateless 
public class MrBean implements MrBeanInterface { 
    @PersistenceContext() 
    private EntityManager em; 

    public void persistActivity() { 
     Activity act = new Activity(); 
     act.setNotification(new Notification()); 
     em.persist(act); 
    } 
} 

UPDATE:你可以尝试创建这样的活动的构造函数中的链接:

@Entity 
public class Activity implements Serializable { 
    @OneToOne(cascade={CascadeType.PERSIST}) 
    private Notification notification; 

    public Activity() { 
     this.notification = new Notification(); 
    } 
} 

@Entity 
public class Notification implements Serializable { } 

@Stateless 
public class MrBean implements MrBeanInterface { 
    @PersistenceContext() 
    private EntityManager em; 

    public void persistActivity() { 
     Activity act = new Activity(); 
     em.persist(act); 
    } 
} 

需要注意的一点是,我认为你不能使用@PostPersist。更确切地说,你必须连接NotificationActivity,然后继续Activity才能使cascade={CascadeType.PERSIST}正常工作。

+0

谢谢 - 我需要在pre/postPersist方法中添加通知,因为我想确保每次创建Activity时都会创建相应的通知。如果您认为通知是需要保证的审计对象,那么第一个解决方案就有可能会有人调用em.persist(act);代码库中的任何其他位置(批处理/操作类或任何其他服务类),除非它们也添加通知代码,否则我们不会得到我们的审计。 第二种解决方案是我为我的方法尝试1)在原始帖子中,但是正在悄然失败。 – rhinds 2011-12-27 09:05:02

+0

@rhinds我刚刚更新了我的答案。你可以在Activity的构造函数中创建链接。 – 2011-12-27 09:25:49

+0

谢谢,我会试试这个 - 尽管它仍然看起来不太理想,因为在持续之前仍然会对编辑进行打开。看起来像预留持久性应该是做这种操作的正确位置,例如,我们以前使用prePersist方法来设置所有对象的修改日期,并且意味着修改日期永远不会被手动更改或覆盖 – rhinds 2011-12-27 17:32:04

2

您可以使用StatelessSession接口在Hibernate事件侦听器中插入其他实体(插入,更新,刷新等)。但我不知道这是否也可以使用严格的JPA唯一代码(EntityManagerFactoryEntityManager)。

+0

是的,它是特定于实现的,但Hibernate和EclipseLink都有类似的东西。 – wrschneider 2011-12-27 01:36:53

+0

谢谢 - 这适合运行时间持续?我注意到文档将其称为批处理操作界面,并且不使用任何第一/第二级缓存。 – rhinds 2011-12-27 17:23:52

相关问题