由于您希望实体类保持不可变,因此我可以考虑两种解决方案:
1)创建实体的子类,但不要将其声明为实体。您还可以创建一个包装类,接收Entity
作为构造函数参数,并通过 getter 和 setter 直接操作原始对象上的数据。子类化的优点是已经继承了公共方法,但缺点是必须关心数据。
检查此答案,了解为什么不将实体子类化为实体以及持久性问题。
public class EntitySubclass extends Entity {
private Entity parent;
public EntitySubclass(Entity parent) {
this.parent = parent;
// set all data from parent to this entity.
}
// fetch the parent object for persistance.
public Entity getParent() {
// set all data from this to parent.
}
public int getTotal() {
int iDidMathOnEntityData = 0;
// do math
return iDidMathOnEntityData;
}
}
jsf:
<p:column headerText="total">
<h:outputText value="#{subClass.total}" />
</p:column>
2) 使用rowIndexVar
( https://stackoverflow.com/a/5704087/1532705rowIndexVar
) 并在传递as 参数的托管 Bean 上调用方法。然后获取相应的实体并进行数学运算。需要 EL 2.2。
<p:column headerText="total">
<h:outputText value="#{bean.total(rowIndexVar)}" />
</p:column>
托管豆:
public int total(int rowIndexVar) {
int iDidMathOnEntityData = 0;
Entity e = getEntityByIndex(rowIndexVar);
// do some math
return iDidMathOnEntityData;
}
3)如果有相同问题的人编辑实体没有问题,您可以将getTotal()
方法添加为@Transient
:
@Transient
public int getTotal() {
int iDidMathOnEntityData = 0;
// do math
return iDidMathOnEntityData;
}