唯一索引或主键冲突

唯一索引或主键冲突

我是休眠的新手,并且遇到以下问题。 “唯一索引或主键冲突”。由于错误的映射而出现问题,但是我花了数小时来弄清楚为什么会这样。

我有一个超类叫做DataStructure

@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class DataStructure {

private int DS_ID;


    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    public int getDataStructureID()  {
        return DS_ID;
    }


然后是类关联,其中关联两个元素。为了简化起见,此处省略了该类的某些部分。

@Entity
public class AssociationTemporal extends DataStructure {

    private DataStructure elementA;
    private DataStructure elementB;

    @OneToOne
    public DataStructure getElementA() {
        return elementA;
    }
    public void setElementA(DataStructure elementA) {
        this.elementA = elementA;
    }

    @OneToOne
    public DataStructure getElementB() {
        return elementB;
    }
    public void setElementB(DataStructure elementB) {
        this.elementB = elementB;
    }
}


该类充当DataStructure类型的两个类之间的中间类。像这样。

TP协会

TP类:

@Entity
public class TP extends DataStructure {

    List<AssociationTemporal> listOfAssociatedTPs = new ArrayList<AssociationTemporal>();

    @OneToMany
    public List<AssociationTemporal> getListOfAssociatedTPs() {
        return listOfAssociatedTPs;
    }

    public void setListOfAssociatedTPs(List<AssociationTemporal> listOfAssociatedTPs) {
        this.listOfAssociatedTPs = listOfAssociatedTPs;
    }


}


或活动课

@Entity
public class Activities extends DataStructure {

        String name;
        List<AssociationTemporal> listOfAsso = new ArrayList<AssociationTemporal>();

        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        @OneToMany
        public List<AssociationTemporal> getListOfAsso() {
            return listOfAsso;
        }
        public void setListOfAsso(List<AssociationTemporal> listOfAsso) {
            this.listOfAsso = listOfAsso;
        }


}


在主要方面,我添加了以下内容:

AssociationTemporal at = new AssociationTemporal();

        TP tp1 = new TP();
        TP tp2 = new TP();

        at.setElementA(tp1);
        at.setElementB(tp2);

        session.save(tp1);
        session.save(tp2);
        session.save(at);

        tp1.getListOfAssociatedTPs().add(at);
        tp2.getListOfAssociatedTPs().add(at);

        session.getTransaction().commit();


只要我尝试添加相同的对象,就会出现问题

        tp1.getListOfAssociatedTPs().add(at);
        tp2.getListOfAssociatedTPs().add(at);



  由以下原因引起:org.h2.jdbc.JdbcSQLException:唯一索引或主键冲突:“ UK_12JEPI3MP039NKMGO47YW1HBI_INDEX_A在PUBLIC.TP_ASSOCIATIONTEMPORAL(LISTOFASSOCIATEDTPS_DATASTRUCTUREID)值(32770,1)”上; SQL语句:
  插入PUBLIC.TP_AssociationTemporal(TP_dataStructureID,listOfAssociatedTPs_dataStructureID)值(?,?)[23505-183]


以同样的方式,可以与活动等建立关联。

最佳答案

只需使用GenerationType.SEQUENCE即可解决问题。

07-26 09:29