【问题标题】:OpenJPA @OneToMany List returning nullOpenJPA @OneToMany 列表返回 null
【发布时间】:2015-11-14 18:26:58
【问题描述】:

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

在我的项目中,我有一个主要的实体类,我们将其称为“客户”。对于客户端,您可能有多个位置和多个联系人,因此我将这两个设置都设置为使用 @OneToMany 的单向实体映射。我能够通过映射到地址和联系人来生成客户端,这些表中的每一个都有对应于客户端的 ID。当我然后去查看数据时,“客户端”中的所有数据都在那里,但“地址”和“联系人”的值为 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。

【问题讨论】:

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


    【解决方案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();
      

    【讨论】:

      猜你喜欢
      • 2020-02-25
      • 1970-01-01
      • 2013-06-25
      • 2015-08-20
      • 1970-01-01
      • 2017-12-06
      • 2018-05-29
      • 1970-01-01
      • 2015-09-08
      相关资源
      最近更新 更多