因为 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 也是如此。
你可以做几件事:
- 我认为这里最好的办法是将字段包装在 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;
}
- 为 ui(Bean) 和 DB(Hibernate) 创建不同的实体。在许多情况下 ui 层和实体不相同,有时不应耦合
- 您可以在休眠实体和 ui 层(Jsp bean)
中使用继承并创建不同的实现
如果你问我,我认为最好是在第 1 节中做些什么。如果这种情况经常发生,你应该考虑解耦你的 ui 层和业务实体。
删除您实体上的 @Transient
。根据您嵌入的 ID,您选择了字段注释。您应该能够拥有一个 getter,Hibernate 不会在没有明确标记的情况下尝试保留它。并更改 getter/setter 以使用正确的 JavaBean 语法。 getId
而不是 getid
.
在 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 也是如此。
你可以做几件事:
- 我认为这里最好的办法是将字段包装在 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; }
- 为 ui(Bean) 和 DB(Hibernate) 创建不同的实体。在许多情况下 ui 层和实体不相同,有时不应耦合
- 您可以在休眠实体和 ui 层(Jsp bean) 中使用继承并创建不同的实现
如果你问我,我认为最好是在第 1 节中做些什么。如果这种情况经常发生,你应该考虑解耦你的 ui 层和业务实体。
删除您实体上的 @Transient
。根据您嵌入的 ID,您选择了字段注释。您应该能够拥有一个 getter,Hibernate 不会在没有明确标记的情况下尝试保留它。并更改 getter/setter 以使用正确的 JavaBean 语法。 getId
而不是 getid
.