Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate映射和唯一索引或主键冲突_Java_Hibernate_Orm_H2 - Fatal编程技术网

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

Java Hibernate映射和唯一索引或主键冲突,java,hibernate,orm,h2,Java,Hibernate,Orm,H2,我是新加入hibernate的,我遇到了以下问题。“唯一索引或主键冲突”。这个问题是由于错误的映射而出现的,但我花了几个小时来找出它发生的原因 我有一个超级类叫做DataStructure @Entity @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) public abstract class DataStructure { private int DS_ID; @Id @GeneratedValue(stra

我是新加入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;
    }
}   
此类充当两类数据结构类型之间的中间类。像这样

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;
    }


}
当我尝试添加相同的对象时,问题就出现了

        tp1.getListOfAssociatedTPs().add(at);
        tp2.getListOfAssociatedTPs().add(at);
由以下原因引起:org.h2.jdbc.JdbcSQLException:唯一索引或主键冲突:“PUBLIC.TP_ASSOCIATIONTEMPORAL(LISTOFASSOCIATEDTPS_数据结构ID)值(32770,1)”上的UK_12JEPI3MP039NKMGO47YW1HBI_索引A;SQL语句: 插入PUBLIC.TP_AssociationTemporal(TP_数据结构ID,listOfAssociatedTPs_数据结构ID)值(?,)[23505-183]


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

只需使用生成类型.顺序即可解决问题。

只需使用生成类型.顺序即可解决问题

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);