我在java ee6环境中使用JPA2和hibernate作为提供者。
我有一对多关系,当得到一方显示在JSF页面中的所有行时,我想显示一些方面的属性,**但不是全部**,甚至避免加载那些在填充许多辅助实体时对它们进行属性 我不知道该怎么做。
这是一个片段
我想得到表A的所有行并在jsf表中显示它们, 当显示表A的行时,我还想显示一些属性 来自同一个jsf表中的表B,理想情况下甚至不检索/存储未使用的 表B中的属性
TBL_A
________________
int ID
varchar FIRSTNAME
varchar LASTNAME
,第二个是
TBL_B
___________
int ID
varchar VERSION // display on jsf page
varchar XML_DATA //large, don't want to load when getting results for A/B join
int A_ID
和我的JPA2关联类是这样的
@Entity
@Table(name = "TBL_A")
@NamedQueries // not sure what sql to create to accomplish this?
({ @NamedQuery(name = "A_and_B.findAll", query = "SELECT a FROM EntityA a") })
public class EntityA implements Serializable
{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@NotNull
@Column(name = "ID", nullable = false)
private Integer id;
.
@Column(name = "FIRSTNAME")
private String firstname;
.
@Column(name = "LASTNAME")
private String lastname;
.
@OneToMany(mappedBy = "entityA", fetch = FetchType.EAGER)
private List<EntityB> entityBList;
和我的TBL_B关联实体
@Entity
@Table(name = "TBL_B")
public class EntityB implements Serializable
{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@NotNull
@Column(name = "ID", nullable = false)
private Integer id;
.
@Column(name = "VERSION")
private String version;
.
@Column(name = "XML_DATA")
private String xmlData;
.
@JoinColumn(name = "A_ID", referencedColumnName = "ID")
@ManyToOne
private EntityA entityA;
我有一个JSF页面,显示TBL_A条目的数据表/列表 获取TBL_A的所有行时,TBL_B中的VERSION列。
我不得不使用EAGER的fetch类型来避免hibernate延迟的instatiation错误 要做到这一点。希望这是正确的方法。
当加载所有TBL_B实体时,我想我不介意急切地加载entityBList中的所有TBL_B行,但我不希望EntityB bean列表加载了xmlData属性,因为它非常大。
有人能解释我怎么能这样做吗?
如何使用我的命名查询来实现这一点
public List<EntityA> findAll_A_Entities()
{
return em.createNamedQuery("A_and_B.findAll", EntityA.class).getResultList();
}
答案 0 :(得分:0)
一种解决方案是使属性变得懒惰 - 但这需要额外的构建配置 - 请参阅doc。
另一个选项是将xmlData字段移动到派生类并使用hibernate继承支持。
如果您直接查询EntityB,则可以使用投影查询仅选择所需的字段。当它在集合关联中时是不可能的。