2

我需要执行一个数据库查询,以便在多对多关联表中设置额外的列“按列排序”。所以我需要从 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);

}
}

如何从 setOrderBit () 中访问 entitymanger?我如何将 Entitymanager 传递给它?或者我如何在实体类中执行本机查询?

4

2 回答 2

2

EntityManager不推荐注入实体 bean。在我看来,作为 POJO 的实体 bean 是用于层或网络之间的数据传输。

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

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

于 2012-03-15T18:59:50.810 回答
1

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

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

[43] 此类操作的语义可能会在本规范的未来版本中标准化。

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

于 2012-03-14T19:03:20.873 回答