gpt4 book ai didi

java - key 'PRIMARY' 的重复条目使用 JPA 持久保存到数据库中

转载 作者:可可西里 更新时间:2023-11-01 06:41:10 25 4
gpt4 key购买 nike

我在将 JPA 持久保存到我的数据库时遇到错误,当我将第二个文件持久保存到数据库时发生错误。我需要导入大量数据集,每个数据集有 5 张。即使其中已经存在一些相同的数据,也需要更新每个表。目前我收到以下错误

错误

17:26:35,315 WARN  [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (http-localhost-127.0.0.1-8080-1) SQL Error: 1062, SQLState: 23000
17:26:35,316 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (http-localhost-127.0.0.1-8080-1) Duplicate entry '0' for key 'PRIMARY'

数据库脚本

我创建数据库的脚本如下:

CREATE DATABASE IF NOT EXISTS sampleDB;



use sampleDB;



CREATE TABLE IF NOT EXISTS `Table1`(`mcc` int(10) NOT NULL,`mnc` int(10) NOT NULL,`operator` varchar(50) DEFAULT NULL,`country` varchar(50) DEFAULT NULL,

PRIMARY KEY (`mcc`,`mnc`))ENGINE=InnoDB;



CREATE TABLE IF NOT EXISTS `Table2`(`tac` int(10) NOT NULL,`marketingName` varchar(50) DEFAULT NULL,`manufacturer` varchar(50) DEFAULT NULL,

`accessCapability` varchar(200) DEFAULT NULL,`model` varchar(50) DEFAULT NULL,`vendorName` varchar(50) DEFAULT NULL,

`ueType` varchar(20) DEFAULT NULL,`os` varchar(20) DEFAULT NULL,`inputMode` varchar(20) DEFAULT NULL,PRIMARY KEY (`tac`))ENGINE=InnoDB;



CREATE TABLE IF NOT EXISTS `Table3`(`causeClass` varchar(10) NOT NULL,`description` varchar(255) NOT NULL,PRIMARY KEY (`causeClass`))ENGINE=InnoDB;



CREATE TABLE IF NOT EXISTS `Table4`(`causeCode` int(5) NOT NULL,`eventId` int(5) NOT NULL,`description` varchar(255) DEFAULT NULL,

PRIMARY KEY (`causeCode`,`eventId`) ON UPDATE NO ACTION))ENGINE=InnoDB;



CREATE TABLE IF NOT EXISTS `Table5`(`baseDataTableId` int(11) NOT NULL AUTO_INCREMENT,`dateTime` DATETIME NOT NULL,`eventId` int(5) NOT NULL,`causeClass` varchar(10) NOT NULL,

`ueType` int(15) NOT NULL,`market` int(10) NOT NULL,`operator` int(10) NOT NULL,`cellId` tinyint(2) DEFAULT NULL,`duration` smallint(7) DEFAULT NULL,

`causeCode` int(5) NOT NULL,`neVersion` varchar(7) DEFAULT NULL,`imsi` varchar(255) DEFAULT NULL,`hier3Id` varchar(255) DEFAULT NULL,`hier32Id` varchar(255) DEFAULT NULL,

`hier321Id` varchar(255) DEFAULT NULL,PRIMARY KEY (`baseDataTableId`))ENGINE=InnoDB;

Java hibernate 属性

我的 Hibernate 属性如下:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="primary">
<jta-data-source>java:jboss/datasources/MySqlDS</jta-data-source>
<properties>
<!-- Properties for Hibernate -->
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
<property name="hibernate.show_sql" value="false" />
<property name="hibernate.format_sql" value="false" />
</properties>
</persistence-unit>
</persistence>

Java

实体类示例:

@Entity
@Table(name = "Table3")
public class Table3 {

@Id
private int causeClass;
private String description;

public Table3(){}

public Table3(int causeClass, String description) {
super();
this.causeClass = causeClass;
this.description = description;
}

// getters & setters

}

有什么办法解决这个问题吗?

最佳答案

请确保您正在使用良好的 EntityManager 方法来更新现有实体。您似乎在尝试执行持久操作而不是对现有实体进行合并。持久化实体时, try catch EntityExistsException 或 PersistenceException 并在 catch block 中调用 merge 方法。例如:

save(Enity item){
try{
//Try to insert your entity by calling persist method
}
catch(EntityExistsException e){
//Entity you are trying to insert already exist, then call merge method
}
}

关于java - key 'PRIMARY' 的重复条目使用 JPA 持久保存到数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15643732/

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