使用JPA2保留接口类型列表

时间:2012-01-12 17:25:58

标签: jpa

我怀疑这个问题没有完美的解决方案,所以最不理想的解决方案非常受欢迎。

我正在使用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?

2 个答案:

答案 0 :(得分:1)

您可以尝试使用targetEntity属性,但我不确定它会比显式转换更好:

@OrderColumn( name="COLUMN_ORDER" )
@OneToMany(targetEntity = DashboardColumnSettings.class)
private List<DashboardColumn> columns; 

答案 1 :(得分:0)

取决于JPA的实施(你没有提到哪一个); JPA规范没有定义对接口字段的支持,也没有定义接口集合的支持。 DataNucleus JPA肯定允许它,主要是因为我们也支持JDO,这是JDO规范的一部分。