我怀疑这个问题没有完美的解决方案,所以最不理想的解决方案非常受欢迎。
我正在使用PrimeFaces实现仪表板,我想坚持支持它的模型(使用JPA2)。我已经编写了自己的DashboardModel和DashboardColumn实现,带有必要的注释和我需要的其他字段。该模型如下所示:
@Entity
public class DashboardSettings implements DashboardModel, Serializable{
@Id
private long id;
@OrderColumn( name="COLUMN_ORDER" )
private List<DashboardColumn> columns;
...a few other fields...
public DashboardSettings() {}
@Override
public void addColumn(DashboardColumn column) {
this.columns.add(column);
}
@Override
public List<DashboardColumn> getColumns() {
return columns;
}
...snip...
}
问题是列字段。我希望这个字段可以持久保存到它自己的表中,但由于DashboardColumn是一个接口(并且来自第三方所以无法更改),因此该字段当前存储在blob中。如果我将columns字段的类型更改为我自己的实现(DashboardColumnSettings),它标记为@Entity,则addColumn方法将停止正常工作 - 它必须进行类型检查和强制转换。
类型检查和强制转换不是世界末日,因为此代码仅由我们的开发团队使用,但这是一个旅行危险。有没有办法让columns字段保持同时将其保留为DashboardColumn?
答案 0 :(得分:1)
您可以尝试使用targetEntity
属性,但我不确定它会比显式转换更好:
@OrderColumn( name="COLUMN_ORDER" )
@OneToMany(targetEntity = DashboardColumnSettings.class)
private List<DashboardColumn> columns;
答案 1 :(得分:0)
取决于JPA的实施(你没有提到哪一个); JPA规范没有定义对接口字段的支持,也没有定义接口集合的支持。 DataNucleus JPA肯定允许它,主要是因为我们也支持JDO,这是JDO规范的一部分。