在 JPA 中,实体是带注释的普通旧 Java 对象。但是我还没有找到与它们和数据库进行交互的好方法。
在我当前的应用中,我的基本设计始终是将基于序列的 ID 作为主键,因此我通常必须通过 PK 以外的其他属性查找实体。
对于每个实体,我都有一个无状态的 EJB
@Stateless
public class MyEntApiBean implements MyEntApi {
@PersistenceContext(unitName = "xxx") @Inject EntityManager entityManager;
查询方法都是一些变体
/**
* @return A List of all MyEnts that have some property
* @param someProp some property
*/
public List<MyEnt> getAllMyEntsFromProp(final String someProp) {
try {
final Query query = entityManager.createQuery("select me from MyEnt me where me.someProp = :someProp");
query.setParameter("someProp", someProp);
return query.getResultList();
} catch(final NoResultException nre) {
log.warn("No MyEnts found");
}
return new ArrayList<MyEnt>();
}
所以:
我真的很讨厌在 EJB 中使用这些方法,因为它们似乎属于实体本身,而 EJB 本地接口(interface)让我很烦。
我讨厌在每个方法中使用“try、createQuery、getResultList、catch、log、return”(主要是没有闭包或“with 语句”或 Java 中的类似内容的结果)的重复。
有没有人建议以更好的方式与解决我的一个或两个问题的实体和数据库进行交互?
我目前正在考虑用泛型和反射做一些基本方法,以获得一些通用查询方法来减少重复(问题 2)(稍后我会放一个原型(prototype)供审查)。
谢谢, 安德斯
最佳答案
尝试接缝。 Query Objects为您完成大部分工作,而且它们很容易扩展。或者,您始终可以实现类似的模式。
一般来说,Seam 做了很多有用的事情来弥合 JPA 与您的 View 和业务层之间的差距。您不必使用 JSF 才能使 Seam 有用。
关于java - Java JPA 查询 "layer"的好的设计是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/177927/