当前位置: 首页 > 知识库问答 >
问题:

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

王兴腾
2023-03-14

我是hibernate新手,我遇到了以下问题。“唯一索引或主键冲突”。问题的出现是由于错误的映射,但我花了几个小时来找出为什么会发生这种情况。

我有一个超级类叫做数据结构

@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

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) 值 (32770, 1)“;SQL 语句:插入到 PUBLIC 中。TP_AssociationTemporal (TP_dataStructureID, listOfAssociatedTPs_dataStructureID) 值 (?, ?)[23505-183]

通过同样的方式,可以与活动等进行关联。。。

共有1个答案

武嘉祥
2023-03-14

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

 类似资料:
  • 每当我的应用程序启动时,我总是得到以下错误消息: 将data.sql更改为: 生成以下错误消息:

  • 我正在尝试我们非主键作为外键在我的应用程序。场景如下:我有EMPLOYEE和EMPLOYEE_PROPERTIES表。Employee和Employee属性之间存在一对多的关系。下面是我的架构: 下面是我的hibernate映射XML:------------------------------- -------------员工属性------------------- 是否可以引用非主键作为外键

  • 我开始在我的spring managed java项目中使用flyway(我也在使用hibernate)。 我遵循了飞行路线的文档。我还配置了maven插件,一切正常。 尝试使用maven插件进行清理、初始化和迁移,一切正常。 相反,如果我尝试运行我的应用程序(其中有我的flyway bean): 我看到了: 创建数据库的模式 创建schema_version表 我的脚本创建整个数据库工作 不幸的

  • 尝试通过REST Post方法插入Student对象时得到以下错误 2020-10-08 18:50:08.799错误21708---[nio-8080-exec-7]O.A.C.C.C.[.[.[/].[dispatcherServlet]:servlet.Service()在路径[]上下文中的servlet[dispatcherServlet]引发异常[请求处理失败;嵌套异常是org.spri

  • 尝试通过REST Post方法插入学生对象时出现以下错误 2020-10-08 18:50:08.799错误21708---[nio-8080-exec-7]o. a. c. c.C.[.[.]Servlet.service()的servlet[调度Servlet]在上下文中的路径[]抛出异常[请求处理失败;嵌套异常是org.springframework.dao.数据完整性违反异常:不能执行语句

  • java } cardto.java 唯一索引或主键冲突:由:org.h2.jdbc.jdbcsqlexception使用:唯一索引或主键冲突:“public.car(ID)上的主键”;SQL语句:插入到car(可转换,engine_type,IS_Brooking,IS_Function,license_plate,Manufactor,rating,seat_count,id)值(?,?,?,