6

JPAがデータベースに永続化するというエラーがあります。2番目のファイルをDBに永続化するとエラーが発生します。それぞれ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'

データベーススクリプト

DBを作成するための私のスクリプトは次のとおりです。

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;

JavaHibernateのプロパティ

私の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

}

この問題を解決する方法はありますか?

4

2 に答える 2

8

既存のエンティティを更新するために、適切なEntityManagerのメソッドを使用していることを確認してください。既存のエンティティのマージではなく、永続化操作を実行しようとしているようです。アンチティを永続化する場合は、EntityExistsExceptionまたはPersistenceExceptionをキャッチしてみて、catchブロックで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
    }
}
于 2013-03-27T14:00:03.467 に答える
3

このエラーは、次のように、すでに存在するドメインオブジェクトを更新しようとしたときに発生します。

User user=UserDao.getUserById(1);
session.save(user);

Hibernateはそれを新しいオブジェクトを保存するように扱い、重複するオブジェクトが存在することを検出します。

オブジェクトを更新する前に、まず休止状態からオブジェクトをロードします。

User updatedUser=(User)session.load(User.class, 1);
updatedUser.setName("user name");
session.saveOrUpdate(updatedUser);
于 2014-05-23T10:49:18.653 に答える