Java 列出时未获取JPA实体持久字段

Java 列出时未获取JPA实体持久字段,java,jsf,jpa,Java,Jsf,Jpa,我正在使用JPA构建一个JSF CRUD web应用程序。我想列出我可以从数据库中获取的供应商类型的所有实体。但是,在创建列表视图时,供应商中的一个字段(文章列表)不是必需的,如果在列出供应商的所有内容时提取该字段,则会耗费大量时间。在这种情况下,是否有办法消除这种情况,但在查看供应商的详细信息时获取该字段信息 这是供应商: @Entity @Table(name = "supplier") @NamedQueries({ @NamedQuery(name = "Supplier.fin

我正在使用JPA构建一个JSF CRUD web应用程序。我想列出我可以从数据库中获取的供应商类型的所有实体。但是,在创建列表视图时,
供应商
中的一个字段(
文章列表
)不是必需的,如果在列出供应商的所有内容时提取该字段,则会耗费大量时间。在这种情况下,是否有办法消除这种情况,但在查看
供应商的详细信息时获取该字段信息

这是供应商

@Entity
@Table(name = "supplier")
@NamedQueries({
    @NamedQuery(name = "Supplier.findAll", query = "SELECT s FROM Supplier s"),
    @NamedQuery(name = "Supplier.findBySid", query = "SELECT s FROM Supplier s WHERE s.sid = :sid")})
public class Supplier implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "SID")
    private Short sid;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 255)
    @Column(name = "Supplier")
    private String supplier;
    @OneToMany(cascade = {CascadeType.MERGE,CascadeType.REMOVE,CascadeType.REFRESH}, mappedBy = "supplierSID")
    private List<Article> articleList;  
@实体
@表(name=“供应商”)
@命名查询({
@NamedQuery(name=“Supplier.findAll”,query=“从供应商s中选择s”),
@NamedQuery(name=“Supplier.findBySid”,query=“从供应商s中选择s,其中s.sid=:sid”)}
公共类提供者实现了可序列化{
私有静态最终长serialVersionUID=1L;
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@基本(可选=假)
@列(name=“SID”)
私有短sid;
@基本(可选=假)
@NotNull
@尺寸(最小值=1,最大值=255)
@列(name=“供应商”)
私人字符串供应商;
@OneToMany(cascade={CascadeType.MERGE,CascadeType.REMOVE,CascadeType.REFRESH},mappedBy=“supplierSID”)
私人物品清单;
在执行findAll查询时,我不希望从数据库中填写
文章列表
。我可以控制它吗?

尝试将
获取
属性设置为

延迟抓取允许延迟关系的抓取,直到它被访问。这不仅对于避免数据库访问很重要,而且对于避免不需要的对象的构建成本也很重要

样本使用

@OneToMany(fetch=FetchType.LAZY, cascade = {CascadeType.MERGE,CascadeType.REMOVE,CascadeType.REFRESH}, mappedBy = "supplierSID")
private List<Article> articleList; 
@OneToMany(fetch=FetchType.LAZY,cascade={CascadeType.MERGE,CascadeType.REMOVE,CascadeType.REFRESH},mappedBy=“supplierSID”)
私人物品清单;
获取
-定义从数据库获取数据的策略。(…)延迟策略是对持久性提供程序运行时的一个提示,即在首次访问数据时应延迟获取数据


您可以使用LAZY属性不获取此元素视图模式

@OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE,CascadeType.REMOVE,CascadeType.REFRESH}, mappedBy = "supplierSID")
private List<Article> articleList; 

在这种情况下,JPA会为fetch articleList运行更多sql SELECT。

根据
@OneToMany
应该已经有了fetch类型LAZY,因此您可以在某个地方重写该类型,或者访问该列表。您有没有可能调用
articleList.size()
某个地方?不,我没有那样做。我不知道延迟抓取,而且
@OneToMany
会默认为这个。更多的是假设它会/可能会成为一个问题。默认抓取类型对于所有关系都是延迟的,除了OneToOne和manytone,
public Supplier getFullSuplierEntity(Supplier supplier) {
   supplier.getArticleList().size();   
   return supplier;
}