gpt4 book ai didi

java - Hibernate 映射和唯一索引或主键违规

转载 作者:太空宇宙 更新时间:2023-11-04 13:44:12 24 4
gpt4 key购买 nike

我是 hibernate 新手,遇到以下问题。 “唯一索引或主键违规”。该问题是由于错误的映射而出现的,但我花了几个小时才找出发生这种情况的原因。

我有一个名为 DataStructure 的父类(super class)

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


}

或者 Activity 类

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

Caused by: org.h2.jdbc.JdbcSQLException: Unique index or primary key violation: "UK_12JEPI3MP039NKMGO47YW1HBI_INDEX_A ON PUBLIC.TP_ASSOCIATIONTEMPORAL(LISTOFASSOCIATEDTPS_DATASTRUCTUREID) VALUES (32770, 1)"; SQL statement: insert into PUBLIC.TP_AssociationTemporal (TP_dataStructureID, listOfAssociatedTPs_dataStructureID) values (?, ?) [23505-183]

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

最佳答案

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

关于java - Hibernate 映射和唯一索引或主键违规,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31030087/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com