【问题标题】:read persistente bag property in xhtml (jsf)读取 xhtml (jsf) 中的persistente bag 属性
【发布时间】:2013-06-18 13:14:07
【问题描述】:

Morning Stack 成员,

你能帮我解决这个问题吗?

我试图从一个对象中读取一个持久集属性,但它只返回一行,并且我在数据库表中插入了两行这样的 id

  • 如何在 dataTable 中加载所有行?
  • 如何读取 LinkHashSet 表中加载的所有字段为 id、名称、描述等...

豆:

@Inject
private Pessoa pessoa;

实体佩索阿:

@Entity
@Table(name = "pessoa",uniqueConstraints = {@UniqueConstraint(columnNames = { "idt_pessoa" }) })
@Inheritance(strategy = InheritanceType.JOINED)
@OneToMany
@JoinColumn(name = "idt_pessoa")
private Set<ContatoPessoa> contatoPessoas = new LinkedHashSet<ContatoPessoa>();

public Set<ContatoPessoa> getContatoPessoas() {
    return contatoPessoas;
}

public void setContatoPessoas(Set<ContatoPessoa> contatoPessoas) {
    this.contatoPessoas = contatoPessoas;
}

ContatoPessoa 实体:

@Entity
@Table(name="contato_pessoa")
public class ContatoPessoa implements Entidade{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "idt_contatoPessoa")
private Long id;

@Column(length=100)
private String des_areaContatoPessoa;

@Column(length=100)
private String des_emailContatoPessoa;

在 xhtml 中:

<p:dataTable id="dTContato" var="contatoPessoas"
value="#{pessoaMB.pessoa.contatoPessoas}"
rowKey="#{pessoa.contatoPessoas.id}">
<p:column headerText="#{bundle.pessoa_lblid}">
<p:outputLabel value="#{contatoPessoas.key}"/>
</p:column>

我在 xhtml p:outputLabel 中尝试过不同的组合,但完全没有成功

我从对象pessoa 观察了持久集,它具有值。包是ArrayList

我没有发布图片的声誉。对不起

【问题讨论】:

  • 请发布您的 java 代码。您是否看到表中的行并且 id 列是空的,或者您根本没有看到任何行?
  • Ammar,我的 dataTable 只加载所有空行。我确实看到表中的行和 id 列和其他列是空的
  • @BalusC 你的评论消失了。我不知道为什么。

标签: jsf primefaces persistent


【解决方案1】:

好的,现在我知道发生了什么...您不能在数据表中使用 Set。你必须使用一些有序的集合。有关详细信息,请参阅this question.... 我建议创建一个新方法

public List<ContatoPessoa> getContatoPessoasList() {
    return new ArrayList<ContatoPessoa>(contatoPessoas);
}

并将您的绑定更改为:value="#{pessoaMB.pessoa.contatoPessoasList}"

【讨论】:

  • 是的。我已经阅读了您发布的链接。问题是当我实现该属性时,List Hybernate 告诉我有多个 fetch join 那是因为我加入了更多的表。我只是这样工作。你觉得呢?
  • public Object[] getContatoPessoas() { List list = new ArrayList(); for(Object val: contatoPessoas) { if(!list.contains(val)) { list.add((ContatoPessoa) val); } } list.toArray(新对象[0]);返回 list.toArray(new Object[0]); } *** 它以这种方式工作@Infragile ****
  • 我不想让你更改休眠绑定...保留休眠设置,但对于 UI,添加 getContatoPessoasList 方法,它不应该产生休眠错误...我不知道为什么你需要 Object[] 而不是 List... 但我很高兴读到它有效:)
  • ***已解决**** @Ammar 我保持休眠绑定并按照您告诉我的方式设置 UI。效果很好....非常感谢
【解决方案2】:

对我来说,您似乎在 outputLabel 中使用了错误的 var 变量。在您的表中,您定义了var="car"。所以而不是:

<p:outputLabel value="#{pessoa.contatoPessoas.id}"/>

您应该使用通过此car 变量访问您的值,例如:

<p:outputLabel value="#{car.id}"/>

更新

你的rowKey 属性似乎也有问题,改成这样:

rowKey="#{contatoPessoas.id}"

更新

正如@Ammar 上面提到的那样,在 2.2 之前的 JSF 中不支持 set 也存在问题。所以另一种解决方案是升级到 JSF 2.2

【讨论】:

  • Infragile,我得到这个错误更改为 #{car.id} -> 类 'org.hibernate.collection.internal.PersistentSet' 没有属性 'id'。
  • 奇怪...请发布您的p:dataTable 标记(更新您的问题)
  • 好的,现在可以请您以这种方式发布所有对象 - pessoaMB.pessoa.contatoPessoas - pessoaMB, pessoa, contatoPessoas
  • 我没有信用可以发布图片。 @Infragile 你需要什么样的信息?我发布这个没有问题,但是后面有一堆代码。大声笑
  • 我想检查一下这条路径是否真的可以 - pessoaMB.pessoa.contatoPessoas
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-12
  • 2014-10-02
  • 2011-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-02
相关资源
最近更新 更多