我正在尝试构建一个简单的Rest服务,我可以在其中添加客户端并更新它们,基本上作为学习Java EE技术的经验。我在TomEE中运行这个应用程序,并使用Eclipse和Maven来编码和构建它。
在我的项目中,我有一个主实体类,我们将其称为"客户端"。对于客户端,您可能有几个位置和几个联系人,所以我使用@OneToMany将这两个设置为单向实体映射。我能够生成映射到地址和联系人的客户端,其中每个表的ID对应于客户端。当我然后去查看数据时,"客户端"中的所有数据都在那里,但只是"地址"one_answers"联系人"的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
定义一个即时获取类型,如下所示:@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER) @JoinColumn(name="vendor_id", referencedColumnName="id") private List<ClientAddress> addresses
-
您可以在您的条件查询中添加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();