我需要执行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类中执行本机查询?
答案 0 :(得分:2)
不建议在实体bean中注入EntityManager
。在我看来,充当POJO的实体bean用于层或网络之间的数据传输。
它更好地预先填充实体,数据操作先前的持久性。但是,可以在实体回调方法中对属性或数据格式进行一些验证。
在这里,您可以通过在实体上应用@EntityListeners
注释来尝试使用实体侦听器,该注释会在实体生命周期回调方法中得到通知。
答案 1 :(得分:1)
您不应该在pre-persist(或一般的生命周期方法)中使用EntityManager,因为它不是根据规范大声说明:
通常,便携式应用程序的生命周期方法不应该 调用EntityManager或Query操作,访问其他实体 实例,或修改同一持久性内的关系 上下文。[43]生命周期回调方法可以修改post持久化 调用它的实体的非关系状态。
[43]此类操作的语义可能在未来标准化 发布此规范。
只需获取普通的JDBC连接并使用它来执行查询。