小编Coj*_*nes的帖子

如何使用JPA检索多个对象?

我在这个数据模型中使用JPA2/hibernate:

class Stock {
  @ManyToOne
  private StockGroup stockGroup;
  private boolean visible;
}
class StockGroup {
  @OneToMany(mappedBy = "stockGroup")
  private List<Stock> stocks;
}
Run Code Online (Sandbox Code Playgroud)

我想检索StockGroup的包含Stock的位置visible==true.
我想出了这个错误的代码:

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<StockGroup> q = cb.createQuery(StockGroup.class);
Root<StockGroup> r = q.from(StockGroup.class);
Join<StockGroup, Stock> j = r.join(StockGroup_.stocks, JoinType.INNER);
Predicate p = cb.equal(j.get(Stock_.visible), true);

// This becomes a cartesian product :(
List<StockGroup> l = em.createQuery(q.where(p)).getResultList();   
// Stocks are not filtered on visible :(
l.get(0).getStocks();
Run Code Online (Sandbox Code Playgroud)

是否可以使用一个CriteriaQuery检索StockGroup和Stock对象,或者JPA是否只能一次填充一个类型?或者我可以在.getStocks()懒惰填充时添加一些标准吗?

java orm hibernate jpa jpa-2.0

7
推荐指数
1
解决办法
6403
查看次数

间接Hibernate/JPA方法调用丢失事务

我正在使用Spring/JPA2/hibernate代码:

class A {
  @Autowired
  B b;

  @RequestMapping("/test")
  public void test(final HttpServletRequest r1, HttpServletResponse r2) throws ... {

    b.inner();   // Works

    b.outer();   // javax.persistence.TransactionRequiredException: 
                 // no transaction is in progress ... :|
}

@Component
class B {
   @PersistenceContext
   EntityManager em;

   public void outer() { inner(); }

   @Transactional
   public void inner() { em.flush(); }
}
Run Code Online (Sandbox Code Playgroud)

为什么inner()只有在间接调用时才会松散交易?

java spring hibernate jpa-2.0

3
推荐指数
1
解决办法
1549
查看次数

标签 统计

hibernate ×2

java ×2

jpa-2.0 ×2

jpa ×1

orm ×1

spring ×1