Hibernate映射和唯一索引或主键冲突

时间:2015-06-24 15:01:30

标签: java hibernate orm h2

我是hibernate的新手,我遇到了以下问题。 "唯一索引或主键违规"。问题出现是由于错误的映射,但我花了几个小时来弄清楚它为什么会发生。

我有一个名为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

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:唯一索引或主键违规:&#34; UK_12JEPI3MP039NKMGO47YW1HBI_INDEX_A ON PUBLIC.TP_ASSOCIATIONTEMPORAL(LISTOFASSOCIATEDTPS_DATASTRUCTUREID)VALUES(32770,1)&#34 ;; SQL语句:   插入PUBLIC.TP_AssociationTemporal(TP_dataStructureID,listOfAssociatedTPs_dataStructureID)值(?,?)[23505-183]

同样的意思是可以与活动等进行关联......

1 个答案:

答案 0 :(得分:0)

只需使用 GenerationType.SEQUENCE ,它就能解决问题。