将对象保存到数据库时得到MySQLIntegrityConstraintViolationException。我知道此错误意味着什么,但我无法解决。

错误:Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '12345' for key 'PRIMARY'

基本上,我想将课程对象保存到数据库中。每个课程对象可以具有多个学习路径对象,而这些学习路径对象又可以是多个课程对象的一部分。

PersistenceManager pm = pmf.getPersistenceManager();
Transaction tx = pm.currentTransaction();

try {
    tx.begin();
    Query query = pm.newQuery(Studypath.class,"studypathID == paramStudypathID");
    query.declareParameters("Integer paramStudypathID");
    query.setUnique(true);
    Studypath dbStudypath = (Studypath)query.execute(12345);

    Studypath detachedStudypath = null;
    if (dbStudypath != null) {
        detachedStudypath = (Studypath)pm.detachCopy(dbStudypath);
    } else {
        Studypath newStudypath = new Studypath();
        // ...
        pm.makePersistent(newStudypath);
        detachedStudypath = (Studypath)pm.detachCopy(newStudypath);
    }

    tx.commit();

    // now I want to add  this detached studypath to my newly created course
    Course c = new Course();
    c.addStudypath(detachedStudypath);

    tx.begin();
    pm.makePersistent(c); // <== error
    tx.commit();
}
catch (Exception e)
{
    //... handle exceptions
}
finally
{
    if (tx.isActive())
    {
        // Error occurred so rollback the transaction
        tx.rollback();
    }
    pm.close();
}


Course.java

@PersistenceCabable
public class Course {
    // ...

    @Persistent
    private Set<Studypath> studypaths;
}


Studypath.java

@PersistenceCabable
public class Studypath {
    // ...

    @Persistent
    @PrimaryKey
    private Integer studypathID;
}


我有什么明显的失误吗?提前致谢!

更新(日志):

DEBUG [DataNucleus.Datastore.Native] - SELECT 'Courses.Studypath' AS NUCLEUS_TYPE, ... FROM `STUDYPATH` `A0` WHERE `A0`.`STUDYPATHID` = <12345> // this one already exists
DEBUG [DataNucleus.Datastore.Retrieve] - Execution Time = 0 ms
DEBUG [DataNucleus.Datastore.Retrieve] - Retrieving PreparedStatement for connection "jdbc:mysql://127.0.0.1/database, UserName=user, MySQL-AB JDBC Driver"

DEBUG [DataNucleus.Datastore.Native] - SELECT 'Courses.Course' AS NUCLEUS_TYPE, ... FROM `COURSE` `A0` WHERE `A0`.`COURSEID` = <1111> // there is no such course, thus it gets created
DEBUG [DataNucleus.Datastore.Retrieve] - Execution Time = 1 ms
DEBUG [DataNucleus.Datastore.Retrieve] - Retrieving PreparedStatement for connection "jdbc:mysql://127.0.0.1/database, UserName=user, MySQL-AB JDBC Driver"
DEBUG [DataNucleus.Datastore.Native] - INSERT INTO `COURSE` (...,`COURSEID`) VALUES (...,<1111>)
DEBUG [DataNucleus.Datastore.Persist] - Execution Time = 1 ms (number of rows = 1)
DEBUG [DataNucleus.Datastore.Retrieve] - Closing PreparedStatement org.datanucleus.store.rdbms.ParamLoggingPreparedStatement@3baac1b5

DEBUG [DataNucleus.Datastore.Persist] - The requested statement "INSERT INTO `STUDYPATH` (...) VALUES (...)" has been made batchable
DEBUG [DataNucleus.Datastore.Persist] - Batch has been added to statement "INSERT INTO `STUDYPATH` (...) VALUES (...)" for processing (batch size = 1)
DEBUG [DataNucleus.Datastore.Persist] - Adding statement "INSERT INTO `STUDYPATH` (...) VALUES (...)" to the current batch (new batch size = 2)
DEBUG [DataNucleus.Datastore.Persist] - Batch has been added to statement "INSERT INTO `STUDYPATH` (...) VALUES (...)" for processing (batch size = 2)
DEBUG [DataNucleus.Datastore.Native] - BATCH [INSERT INTO `STUDYPATH` (...,`STUDYPATHID`) VALUES (...,<12345>); INSERT INTO `STUDYPATH` (...,`STUDYPATHID`) VALUES (<54321>)]
ERROR [DataNucleus.Datastore] - Exception thrown

最佳答案

我不确定将分离的JDO与瞬态JDO相关联是否符合犹太标准。对于ORM而言,要知道该关系是现有的JDO,没有简单的方法。

如果确实在同一代码路径中,我将关联持久实例:

c.addStudypath(dbStudypath);


否则,在关联它之前,我将makePersistent(detachedStudypath)(假设您的课程是@Detachable)。

关于java - JDO/重复输入异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9619955/

10-10 06:08