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”