Java Hibernate抛出;实体映射中的重复列“;将OrderColumn与两个列表一起使用时

Java Hibernate抛出;实体映射中的重复列“;将OrderColumn与两个列表一起使用时,java,hibernate,jpa,inheritance,Java,Hibernate,Jpa,Inheritance,我有一个棘手的问题,让hibernate对同一实体的两个列表进行排序。有了一些代码,我就更容易理解我想做什么了 @MappedSuperclass public abstract class AbstractParent { List<CommonObject> commonObjects; public abstract List<CommonObject> getCommonObjects(); } @Entity @Table publ

我有一个棘手的问题,让hibernate对同一实体的两个列表进行排序。有了一些代码,我就更容易理解我想做什么了

@MappedSuperclass 
public abstract class AbstractParent { 
    List<CommonObject> commonObjects;

    public abstract List<CommonObject> getCommonObjects(); 
}

@Entity 
@Table 
public class Child1 extends AbstractParent {

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name="child1_id", nullable = false) 
    @OrderColumn(name = "sort_index") 
    public List<CommonObject> getCommonObject() { 
       return this.commonObjects; 
    } 
}

@Entity 
@Table 
public class Child2 extends AbstractParent {

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name="child2_id", nullable = false) 
    @OrderColumn(name = "sort_index") 
     public List<CommonObject> getCommonObject() { 
         return this.commonObjects; 
     } 
}
@MappedSuperclass
公共抽象类AbstractParent{
列出公共物品;
公共抽象列表getCommonObjects();
}
@实体
@桌子
公共类Child1扩展了AbstractParent{
@OneToMany(cascade=CascadeType.ALL,orphan=true)
@JoinColumn(name=“child1\u id”,nullable=false)
@OrderColumn(name=“sort\u index”)
公共列表getCommonObject(){
返回此.commonObjects;
} 
}
@实体
@桌子
公共类Child2扩展了AbstractParent{
@OneToMany(cascade=CascadeType.ALL,orphan=true)
@JoinColumn(name=“child2\u id”,nullable=false)
@OrderColumn(name=“sort\u index”)
公共列表getCommonObject(){
返回此.commonObjects;
} 
}
但是因为hibernate处理列“sort_index”的映射,所以它被映射了两次(对于Child1和Child2)。所以我得到了这个错误:

原因:org.hibernate.MappingException:映射中重复列 对于实体。。。列:排序索引(应与 insert=“false”update=“false”)

我知道如果我放置两个不同的列进行排序,我可以解决这个问题。但我想知道是否有人能给我更好的解决方案


谢谢,

我添加了一个测试来复制您的问题,它在修改到以下位置的映射后工作:

@MappedSuperclass
public abstract class AbstractParent {
    public abstract List<CommonObject> getCommonObjects();
}

@Entity(name = "Child1")
public class Child1 extends AbstractParent {

    @Id
    private Long id;

    @OneToMany(targetEntity = CommonObject.class, cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinTable(name = "child_1_common_objects", joinColumns = @JoinColumn(name="child1_id", nullable = false))
    @OrderColumn(name = "sort_index")
    private List<CommonObject> commonObjects = new ArrayList<>();

    public List<CommonObject> getCommonObjects() {
        return this.commonObjects;
    }
}

@Entity(name = "Child2")
public class Child2 extends AbstractParent {

    @Id
    private Long id;

    @OneToMany(targetEntity = CommonObject.class, cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinTable(name = "child_2_common_objects", joinColumns = @JoinColumn(name="child2_id", nullable = false))
    @OrderColumn(name = "sort_index")
    private List<CommonObject> commonObjects = new ArrayList<>();

    public List<CommonObject> getCommonObjects() {
        return this.commonObjects;
    }
}

@Entity(name = "CommonObject")
public class CommonObject {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
}
@MappedSuperclass
公共抽象类AbstractParent{
公共抽象列表getCommonObjects();
}
@实体(name=“Child1”)
公共类Child1扩展了AbstractParent{
@身份证
私人长id;
@OneToMany(targetEntity=CommonObject.class,cascade=CascadeType.ALL,orphanRemoving=true)
@JoinTable(name=“child\u 1\u common\u objects”,joinColumns=@JoinColumn(name=“child1\u id”,nullable=false))
@OrderColumn(name=“sort\u index”)
private List commonObjects=new ArrayList();
公共列表getCommonObjects(){
返回此.commonObjects;
}
}
@实体(name=“Child2”)
公共类Child2扩展了AbstractParent{
@身份证
私人长id;
@OneToMany(targetEntity=CommonObject.class,cascade=CascadeType.ALL,orphanRemoving=true)
@JoinTable(name=“child\u 2\u common\u objects”,joinColumns=@JoinColumn(name=“child2\u id”,nullable=false))
@OrderColumn(name=“sort\u index”)
private List commonObjects=new ArrayList();
公共列表getCommonObjects(){
返回此.commonObjects;
}
}
@实体(name=“CommonObject”)
公共类公共对象{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私人长id;
}

我添加了一个测试来复制您的问题,它在修改到以下位置的映射后工作:

@MappedSuperclass
public abstract class AbstractParent {
    public abstract List<CommonObject> getCommonObjects();
}

@Entity(name = "Child1")
public class Child1 extends AbstractParent {

    @Id
    private Long id;

    @OneToMany(targetEntity = CommonObject.class, cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinTable(name = "child_1_common_objects", joinColumns = @JoinColumn(name="child1_id", nullable = false))
    @OrderColumn(name = "sort_index")
    private List<CommonObject> commonObjects = new ArrayList<>();

    public List<CommonObject> getCommonObjects() {
        return this.commonObjects;
    }
}

@Entity(name = "Child2")
public class Child2 extends AbstractParent {

    @Id
    private Long id;

    @OneToMany(targetEntity = CommonObject.class, cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinTable(name = "child_2_common_objects", joinColumns = @JoinColumn(name="child2_id", nullable = false))
    @OrderColumn(name = "sort_index")
    private List<CommonObject> commonObjects = new ArrayList<>();

    public List<CommonObject> getCommonObjects() {
        return this.commonObjects;
    }
}

@Entity(name = "CommonObject")
public class CommonObject {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
}
@MappedSuperclass
公共抽象类AbstractParent{
公共抽象列表getCommonObjects();
}
@实体(name=“Child1”)
公共类Child1扩展了AbstractParent{
@身份证
私人长id;
@OneToMany(targetEntity=CommonObject.class,cascade=CascadeType.ALL,orphanRemoving=true)
@JoinTable(name=“child\u 1\u common\u objects”,joinColumns=@JoinColumn(name=“child1\u id”,nullable=false))
@OrderColumn(name=“sort\u index”)
private List commonObjects=new ArrayList();
公共列表getCommonObjects(){
返回此.commonObjects;
}
}
@实体(name=“Child2”)
公共类Child2扩展了AbstractParent{
@身份证
私人长id;
@OneToMany(targetEntity=CommonObject.class,cascade=CascadeType.ALL,orphanRemoving=true)
@JoinTable(name=“child\u 2\u common\u objects”,joinColumns=@JoinColumn(name=“child2\u id”,nullable=false))
@OrderColumn(name=“sort\u index”)
private List commonObjects=new ArrayList();
公共列表getCommonObjects(){
返回此.commonObjects;
}
}
@实体(name=“CommonObject”)
公共类公共对象{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私人长id;
}

谢谢您的回答。因此,如果我理解得很好,我需要另外两个表将我的Child1和Child2对象连接到CommonObject?我没有尝试使用同一个表,但您可以尝试一下,看看它是否有效。谢谢您的回答。因此,如果我理解得很好,我需要另外两个表将我的Child1和Child2对象连接到CommonObject?我没有尝试使用同一个表,但您可以尝试一下,看看它是否有效。