所以,这就是我要做的事情,用简单的演示示例代码:
接口:
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属性 - 我见过的唯一方法,使用它指向实现。但是,它会对该特定实现产生依赖性,从而降低了多态性的灵活性。
我还有其他选择吗?有什么创意可以解决这个问题?