【问题标题】:Hibernate mapping and Unique index or primary key violationHibernate 映射和唯一索引或主键冲突
【发布时间】:2015-09-10 20:44:12
【问题描述】:

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

然后是关联两个元素的类Association。这里省略了类的某些部分,只是为了简化。

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

通过同样的方式可以与活动等建立关联......

【问题讨论】:

    标签: java hibernate orm h2


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2019-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多