如何在EJB3中的Entity类中访问EntityManager

时间:2012-03-14 18:27:34

标签: ejb-3.0 jpa-2.0 postgresql-9.1

我需要执行db查询,以便在多对多关联表中设置额外列“按列排序”。所以我需要从Entity类内部访问db序列,然后选择序列的nextval并将其分配给@prepersist生命周期回调方法中的order_by列。

@Entity
public class ProductWishlist implements Serializable
{

....
@Column(name="ORDER_BIT")
private long orderBit;

// getter setter
// .......

@Prepersist
public void setOrderBit(EntityManager entityManager)
{
   Query q=entityManager.createNativeQuery("select nextval('SHP_PRODUCTS_PICS_ORDER_SEQ')");
Long order=(Long)q.getResultList().get(0);
this.setOrderBit(order);

}
}

@Entity public class ProductWishlist implements Serializable { .... @Column(name="ORDER_BIT") private long orderBit; // getter setter // ....... @Prepersist public void setOrderBit(EntityManager entityManager) { Query q=entityManager.createNativeQuery("select nextval('SHP_PRODUCTS_PICS_ORDER_SEQ')"); Long order=(Long)q.getResultList().get(0); this.setOrderBit(order); } } 我可以从setOrderBit()中访问entitymanger吗?我怎样才能将Entitymanager传递给它? 或者如何在Entity类中执行本机查询?

2 个答案:

答案 0 :(得分:2)

不建议在实体bean中注入EntityManager。在我看来,充当POJO的实体bean用于层或网络之间的数据传输。

它更好地预先填充实体,数据操作先前的持久性。但是,可以在实体回调方法中对属性或数据格式进行一些验证。

在这里,您可以通过在实体上应用@EntityListeners注释来尝试使用实体侦听器,该注释会在实体生命周期回调方法中得到通知。

答案 1 :(得分:1)

您不应该在pre-persist(或一般的生命周期方法)中使用EntityManager,因为它不是根据规范大声说明:

  

通常,便携式应用程序的生命周期方法不应该   调用EntityManager或Query操作,访问其他实体   实例,或修改同一持久性内的关系   上下文。[43]生命周期回调方法可以修改post持久化   调用它的实体的非关系状态。

     

[43]此类操作的语义可能在未来标准化   发布此规范。

只需获取普通的JDBC连接并使用它来执行查询。