首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jdo错误复制键

Jdo错误复制键
EN

Stack Overflow用户
提问于 2014-02-24 16:17:07
回答 1查看 420关注 0票数 0

我有两个班A,B。

这是Main类:

代码语言:javascript
复制
public class Main
{ 
    static PersistenceManagerFactory pmf ;

    static Transaction tx1 ;
    static PersistenceManager pm1 ;

    public Main(){

       pmf = JDOHelper.getPersistenceManagerFactory("datanucleus.properties");

    }

    public static void testB(B b){

        pm1 = pmf.getPersistenceManager();
        tx1=pm1.currentTransaction();

        try {
            tx1.begin();


            B bb=b;

            pm1.makePersistent(bb);


            tx1.commit();

         } finally {
             if (tx1.isActive())
             {
                 tx1.rollback();
             }
             pm1.close();
         }
    }

    public static void main(String args[]) {

        Main n=new Main();

        String id="4";


        A a=new A(id,"prova");

        B b2=new B("4a",a);
        B b3=new B("5a",a);  //// error HERE ////////////////////////////////

        Main.testB(b2);
        Main.testB(b3);
    }
}

当我运行主类时,会得到一个错误,即:

代码语言:javascript
复制
Exception in thread "main" javax.jdo.JDODataStoreException: Insert of object "B@95973d" using statement "INSERT INTO `B` (`ID`,`IDR`) VALUES (?,?)" failed : Duplicate entry '4' for key 'PRIMARY'
at org.datanucleus.api.jdo.NucleusJDOHelper.getJDOExceptionForNucleusException(NucleusJDOHelper.java:421)
at org.datanucleus.api.jdo.JDOPersistenceManager.jdoMakePersistent(JDOPersistenceManager.java:735)
at org.datanucleus.api.jdo.JDOPersistenceManager.makePersistent(JDOPersistenceManager.java:755)
at Main.testB(Main.java:167)
at Main.main(Main.java:322)

据我理解,在主类中,特别是在这一行代码中:

代码语言:javascript
复制
    A a=new A(id,"prova");

    B b2=new B("4a",a);
    B b3=new B("5a",a);  //// error HERE ////////////////////////////////

    Main.testB(b2);
    Main.testB(b3);

我得到错误“重复条目'4‘的关键字’主'”

在表B中,我想为表A的PK插入多个值​​,如何修复它?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-24 16:40:32

因此,当您持久化B时,"A“对象处于”瞬态“状态,因此它每次都会尝试持久化一个新的A。如果您将A持久化,然后分离 it (pm.detachCopy,当对象标记为可拆卸时),并将B的A字段设置为该字段,则它将工作。任何JDO文档都有对分离和对象状态的引用。像这样创造A

代码语言:javascript
复制
pm.currentTransaction().begin();
A a = new A(id,"prova");
a = pm.makePersistent(a);
A detachedA = pm.detachCopy(a);
pm.currentTransaction().commit();

然后使用"detachedA“和B的持久化。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21993064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档