Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用接口集合,并仅持久化实现_Java_Hibernate - Fatal编程技术网

Java 使用接口集合,并仅持久化实现

Java 使用接口集合,并仅持久化实现,java,hibernate,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 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;
    }

}
@实体
公共类形状盒{
@身份证
私有int-boxId
@OneToMany(mappedBy=“box”,cascade=CascadeType.ALL)
私有列表shapeList=new ArrayList();
公共列表getShapeList(){
回归造型师;
}
公共无效集合形状列表(列表形状列表){
this.shapeList=shapeList;
}
public int getBoxId(){
返回boxId;
}
公共区域(int boxId){
this.boxId=boxId;
}
}
我只是把这些直接写进了这个网站,所以如果有小的语法错误,我道歉

重点是,我希望能够在ShapeBox类中使用Shape的一系列子类。ShapeBox有一个Shape接口列表,但其内容都是Shape的子类。所有子类都将正确映射到hibernate

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

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

@接口上的实体-如果所有getter都标记为transient,那么这可能会产生与@MappedSuperclass差不多的效果,但问题相同

targetEntity属性—我所见过的唯一使这项工作正常的方法,使用它来指向实现。然而,它创建了对特定实现的依赖,这降低了多态性的灵活性


我还有其他选择吗?有什么创造性的方法可以解决这个问题吗?

也许我没有遵循。。。
@MappedSuperclass
有什么问题?在ShapeBox中,shapeList的类型是Shape。它抛出异常,因为它无法在形状中找到mappedBy列。“使用一个或多个目标未映射的类”可能我没有遵循。。。
@MappedSuperclass
有什么问题?在ShapeBox中,shapeList的类型是Shape。它抛出异常,因为它无法在形状中找到mappedBy列。“使用以未映射类为目标的OneToMany或ManyToMany”