OpenJPA @OneToMany 列表返回 null
OpenJPA @OneToMany List returning null
我正在尝试构建一个简单的 Rest 服务,我可以在其中添加客户端并更新它们,基本上作为学习 Java EE 技术的一种体验。我在 TomEE 中 运行 这个应用程序并使用 Eclipse 和 Maven 来编码和构建它。
在我的项目中,我有一个主要实体 class,我们称之为 "Clients"。对于客户端,您可能有多个位置和多个联系人,因此我将这两个设置为使用@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
...
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。
我认为,您必须手动获取数据,因为 @OneToMany
关系的默认获取类型是 FetchType.LAZY
。
加载依赖数据有两种选择:
您可以通过使用注解@OneToMany
定义一个eager fetchtype:
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
@JoinColumn(name="vendor_id", referencedColumnName="id")
private List<ClientAddress> addresses
您可以将提取子句添加到条件查询中。
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();
我正在尝试构建一个简单的 Rest 服务,我可以在其中添加客户端并更新它们,基本上作为学习 Java EE 技术的一种体验。我在 TomEE 中 运行 这个应用程序并使用 Eclipse 和 Maven 来编码和构建它。
在我的项目中,我有一个主要实体 class,我们称之为 "Clients"。对于客户端,您可能有多个位置和多个联系人,因此我将这两个设置为使用@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
...
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。
我认为,您必须手动获取数据,因为 @OneToMany
关系的默认获取类型是 FetchType.LAZY
。
加载依赖数据有两种选择:
您可以通过使用注解
@OneToMany
定义一个eager fetchtype:@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER) @JoinColumn(name="vendor_id", referencedColumnName="id") private List<ClientAddress> addresses
您可以将提取子句添加到条件查询中。
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();