Java OpenJPA@OneToMany列表返回null

Java OpenJPA@OneToMany列表返回null,java,jpa-2.0,one-to-many,openjpa,apache-tomee,Java,Jpa 2.0,One To Many,Openjpa,Apache Tomee,我正在尝试构建一个简单的Rest服务,我可以在其中添加客户机并对其进行更新,这基本上是学习JavaEE技术的一种体验。我正在TomEE中运行这个应用程序,并使用Eclipse和Maven来编码和构建它 在我的项目中,我有一个主要的实体类,我们称之为“客户机”。对于客户端,您可能有多个位置和多个联系人,因此我使用@OneToMany将这两个设置都设置为单向实体映射。我能够生成映射到地址和联系人的客户机,这些表中的每个表都有对应于客户机的ID。然后,当我查看数据时,“Client”中的所有数据都在那

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

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

  ...
@Entity
public class ClientAddress {
  ...
}
@Entity
public class ClientContacts {
  ...
}
@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();
    }
    ...
}
ClientContacts.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

  ...
@Entity
public class ClientAddress {
  ...
}
@Entity
public class ClientContacts {
  ...
}
@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();
    }
    ...
}
ClientEntityBroker.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

  ...
@Entity
public class ClientAddress {
  ...
}
@Entity
public class ClientContacts {
  ...
}
@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();
    }
    ...
}
@无状态
@本地豆
公共类卖方实体经纪人{
@PersistenceContext(unitName=“客户端mysql”,
类型=PersistenceContextType.TRANSACTION)
私人实体管理者;
公共列表GetAllClient(){
CriteriaQuery cq=em.getCriteriaBuilder().createQuery(Client.class);
cq.select(cq.from(Client.class));
返回em.createQuery(cq.getResultList();
}
...
}
我在ClientAddress或ClientContacts中都没有@ManyToOne注释,因为它是单向映射。数据库条目都已创建,但我似乎无法按预期检索地址和联系人数据。我是新来的,所以我猜我可能查询的数据有误,或者输入中需要一些额外的东西,以便它能够正确地映射请求


我正在运行OpenJPA 2.4和TomEE 1.7.2。

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

有两个选项可以加载依赖数据:

  • 您可以通过以下方式使用注释
    @OneToMany
    来定义一个类型:

    @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
    @JoinColumn(name="vendor_id", referencedColumnName="id")
    private List<ClientAddress> addresses
    
    @OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)
    @JoinColumn(name=“vendor\u id”,referencedColumnName=“id”)
    私人名单地址
    
  • 您可以将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();
    
    CriteriaQuery cq=em.getCriteriaBuilder().createQuery(Client.class);
    Root=cq.from(Client.class)
    root.fetch(客户端地址);
    root.fetch(客户端联系人);
    返回em.createQuery(cq.getResultList();