使用接口集合,仅保留实现

时间:2015-09-22 18:09:10

标签: java hibernate

所以,这就是我要做的事情,用简单的演示示例代码:

接口:

public interface Shape{
    String getName();
    void setName(String name);
}

类别:

@Entity
public class Circle{
    @Id
    private int id;
    private String name;

    @ManyToOne
    private ShapeBox box;

    @Override
    public String getName(){
        return name;
    }

    @Override
    public void setName(String name){
        this.name = name;
    }

    public int getId(){
        return id;
    }

    public void setId(int id){
        this.id = id;
    }

    public ShapeBox getBox(){
        return box;
    }

    public void setBox(ShapeBox box){
        this.box = box;
    }
}

集合类:

@Entity
public class ShapeBox{
    @Id
    private int boxId

    @OneToMany (mappedBy="box", cascade=CascadeType.ALL)
    private List<Shape> shapeList = new ArrayList<>();

    public List<Shape> getShapeList(){
        return shapeList;
    }

    public void setShapeList(List<Shape> shapeList){
        this.shapeList = shapeList;
    }

    public int getBoxId(){
        return boxId;
    }

    public void setBoxId(int boxId){
        this.boxId = boxId;
    }

}

我真的把所有这些直接写到了这个网站,所以如果有轻微的语法错误,我道歉。

所以,关键是,我希望能够在ShapeBox类中使用Shape的子类集合。 ShapeBox有一个Shape接口的List,但它的内容都是Shape的子类。所有子类都将正确映射为hibernate。

所以,我意识到我不是第一个尝试这样做的人,我在这个网站上看了一些其他的答案,但最终我觉得有人必须至少找出一个丑陋的解决方法,如果没有别的。

到目前为止我所看到的: @MappedSuperclass - 用于绕过未映射实体的异常,但仍然引用了涉及未知实体的mappedBy属性的异常。

接口上的@Entity - 如果所有getter都标记为transient,这可能与@MappedSuperclass具有或多或少相同的效果,但问题相同。

targetEntity属性 - 我见过的唯一方法,使用它指向实现。但是,它会对该特定实现产生依赖性,从而降低了多态性的灵活性。

我还有其他选择吗?有什么创意可以解决这个问题?

0 个答案:

没有答案