OpenJPA @OneToMany列表返回null

时间:2015-08-20 22:44:09

标签: java jpa-2.0 one-to-many openjpa tomee

我正在尝试构建一个简单的Rest服务,我可以在其中添加客户端并更新它们,这基本上是学习Java EE技术的经验。我在TomEE中运行此应用程序,并使用Eclipse和Maven编写代码并构建它。

在我的项目中,我有主要的实体类,我们将其称为"客户"。对于客户端,您可能有多个位置和多个联系人,因此我使用@OneToMany将这两个设置作为单向实体映射。我能够生成具有映射到地址和联系人的客户端,每个表具有对应于客户端的ID。当我然后去查看数据时,所有数据都在"客户端"是的,但是#34;地址"只是一个NULL的值和"联系人"。我使用EJB作为实体管理器,并使用CriteriaQuery设置来获取数据。

Client.java

@Entity
public class Client {
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Long id;

  @OneToMany(cascade=CascadeType.ALL)
  @JoinColumn(name="vendor_id", referencedColumnName="id")
  private List<ClientAddress> addresses

  @OneToMany(cascade=CascadeType.ALL)
  @JoinColumn(name="vendor_id", referencedColumnName="id")
  private List<ClientContact> contacts

  ...

ClientAddress.java

@Entity
public class ClientAddress {
  ...
}

ClientContacts.java

@Entity
public class ClientContacts {
  ...
}

ClientEntityBroker.java

@Stateless
@Localbean
public class VendorEntityBroker {

    @PersistenceContext(unitName = "client-mysql",
                        type=PersistenceContextType.TRANSACTION)
    private EntityManager em;

    public List<Vendor> getAllClients() {
        CriteriaQuery<Client> cq = em.getCriteriaBuilder().createQuery(Client.class);
        cq.select(cq.from(Client.class));

        return em.createQuery(cq).getResultList();
    }
    ...
}

我在ClientAddress或ClientContacts中没有@ManyToOne注释,因为它是单向映射。数据库条目都已创建,但我似乎无法像我预期的那样检索地址和联系人数据。我是新手,所以我想我可能会错误地查询数据,或者在输入上需要额外的东西才能正确映射请求。

我正在运行OpenJPA 2.4和TomEE 1.7.2。

1 个答案:

答案 0 :(得分:1)

我认为,您必须手动提取数据,因为@OneToMany关系的默认提取类型为FetchType.LAZY

您可以通过两种方式加载相关数据:

  1. 您可以通过这种方式使用注释@OneToMany来定义急切的fetchtype:

    @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
    @JoinColumn(name="vendor_id", referencedColumnName="id")
    private List<ClientAddress> addresses
    
  2. 您可以为条件查询添加fetch子句。

    CriteriaQuery<Client> cq = em.getCriteriaBuilder().createQuery(Client.class);
    Root<Client> root = cq.from(Client.class)
    root.fetch(Client_.addresses);
    root.fetch(Client_.contacts);
    return em.createQuery(cq).getResultList();