因为 Hibernate Mapping 需要将某些字段作为 @Transient 但 JSP 无法访问它们

Because of Hibernate Mapping need to have some of the fields as @Transient but JSP does not have access to them

在 Java 中,我可以访问 class 的 Transient 字段的值。但是,我无法访问 JSP 上的相同字段。如何让 JSP 可以使用它们?

我正在使用 Hibernate 检索值,我认为对此的解决方案是 Transformers.aliasToBean 选项,但还有其他解决方案吗?

有没有办法摆脱瞬态注释但在 Hibernate 中有相同的映射?那样的话,问题就迎刃而解了。

@AssociationOverrides({
        @AssociationOverride(name = "tta.names", joinColumns = @JoinColumn(name = "id"))})
public class Names implements java.io.Serializable {

    private static final long serialVersionUID = -30956546435023625398L;

    @EmbeddedId
    private TableToAssociate tta = new TableToAssociate();


    @Transient
    public String getid() {
        return tta.getMyIds().getId();
    }

    public void setid(String id) {
        this.tta.getMyIds().setId(id);
    }

在Java中,我可以使用以下代码访问它们

     System.out.println(mystudents.getNames().iterator().next().getId());

在 JSP 中,我无法访问它们!

    <c:forEach var="nm"items="${mystudents.names}">
                    ${nm.id}
                </c:forEach>

如果我输入另一个 不是瞬态 的名称字段,JSP 会成功显示该项目的值。

这是因为 transient 关键字停止了要序列化的字段。要将对象传递给 JSP,它必须被序列化。该字段不会出现在您的序列化对象中,因此,它对 JSP.

不可用

为了解决您的问题,您应该查看 James 的评论以使用 @Transient 注释。它由 JPA 提供,它应该允许您不将您的值保存在数据库中,而是将其序列化以便您的 JSP 可以使用它。

尝试重命名方法以匹配 JavaBean 规范。

而不是:

@Transient
public String getid() {
    return tta.getMyIds().getId();
}

public void setid(String id) {
    this.tta.getMyIds().setId(id);
}

你应该有:

@Transient
public String getId() {
    return tta.getMyIds().getId();
}

public void setId(String id) {
    this.tta.getMyIds().setId(id);
}

你问的不可能..比我之前说的聪明

@Transient 只是说不要 serialize/deserialize。 Hibernate 不序列化它,jsp bean 也是如此。

你可以做几件事:

  1. 我认为这里最好的办法是将字段包装在 getter 和 bean 中的 setter 中。这样你就可以在 bean 上设置 属性 ,以防万一只有一个字段,其他解决方案将是开销。
public class Bean() {
private Names name;
private String id;
public Bean() {
     //few action to load name
     this.id = name.getid();
}
public String getId() {
    return this.id;
}
  1. 为 ui(Bean) 和 DB(Hibernate) 创建不同的实体。在许多情况下 ui 层和实体不相同,有时不应耦合
  2. 您可以在休眠实体和 ui 层(Jsp bean)
  3. 中使用继承并创建不同的实现

如果你问我,我认为最好是在第 1 节中做些什么。如果这种情况经常发生,你应该考虑解耦你的 ui 层和业务实体。

删除您实体上的 @Transient。根据您嵌入的 ID,您选择了字段注释。您应该能够拥有一个 getter,Hibernate 不会在没有明确标记的情况下尝试保留它。并更改 getter/setter 以使用正确的 JavaBean 语法。 getId 而不是 getid.