makePersistent для принадлежащих одному ко многим rs. не работает надежно в JDO

метод makePersistent PersistenceManager работает ненадежно. один и тот же junit-тест работает и через некоторое время опять падает?! у меня есть объект, который включает в себя набор других объектов. это означает 1-n отношение. моя проблема в том, что junit-тест моих классов иногда дает сбой, потому что объекты в коллекции не сохраняются должным образом. я обычно использую транзакции, но persistanceManager является необязательным для транзакций

я пробовал проверять objectState после каждого createObject и фиксации... я понял, что объекты в коллекции после успешной фиксации не имеют systemId (должны быть сгенерированы автоматически), но находятся в состоянии пустого/постоянно-нетранзакционного.

это означает, что иногда они (если они сохраняются):

Комментарий [systemId=Project(1)/Comment(6), JDO-ObjectState=hollow/persistent-nontransactional]

а иногда и так (если они не сохраняются и рефач родительского объекта содержит пустую коллекцию) Комментарий [systemId=null, JDO-ObjectState=hollow/persistent-nontransactional]

конечно, я мог бы вручную проверить, есть ли у всех сохраненных объектов системный идентификатор, но этот подход совсем не хорош. коммит должен просто потерпеть неудачу!!

я не понимаю, что это иногда работает, а иногда нет! это означает, что мой код не должен быть неправильным, и это ошибка... пожалуйста, помогите мне

PS: я могу опубликовать код, если это необходимо!

@PersistenceCapable
public class Ble implements Serializable, JDOObject<Ble> {

/**
 * 
 */
private static final long serialVersionUID = 1L;

// NotNull
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key systemId;

// NotNull
@Persistent
private Key parentId;

// NotNull
@Persistent
@Extension(vendorName = "datanucleus", key = "gae.parent-pk", value = "true")
private Key projectId;

// NotNull
@Persistent
private String title;

@Persistent
private int position;

@Persistent
private boolean hasChildren;

@Persistent
private BleData requirementData;

@Persistent
private List<Comment> comments;


//getter/setter
}

дочерний объект

    @PersistenceCapable
public class Comment implements Serializable, JDOObject<Comment> {

/**
 * 
 */
private static final long serialVersionUID = 1L;

@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key systemId;

@Persistent
private String text;

@Persistent
private long createdTimestamp;

//getter//Setter    
}

person headgrowe    schedule 04.09.2012    source источник
comment
глядя на журнал сказал бы вам много.   -  person DataNucleus    schedule 05.09.2012
comment
хорошо, где я могу найти «журнал»?   -  person headgrowe    schedule 05.09.2012
comment
Куда вы определили его направление? log4j.properties определил бы это.   -  person DataNucleus    schedule 05.09.2012
comment
спасибо, я нашел лог, но он мне никак не помогает :(   -  person headgrowe    schedule 05.09.2012
comment
журнал и метод вы можете найти ниже в новом ответе   -  person headgrowe    schedule 05.09.2012
comment
Журнал, который вы публикуете, находится на уровне INFO (поэтому опускает все полезные вещи на уровне DEBUG). Используйте v2.x подключаемого модуля GAE JDO.   -  person DataNucleus    schedule 05.09.2012
comment
я пытался использовать другое ядро ​​данных, но оно не работает... SCHWERWIEGEND: для пакета org.datanucleus.api.jdo требуется версия org.datanucleus 3.0.4, но разрешенный пакет имеет версию 3.0.4, которая выходит за пределы ожидаемого диапазона.   -  person headgrowe    schedule 05.09.2012
comment
ведьмовские библиотеки я должен использовать? я использую это прямо сейчас: datanucleus-appengine-1.0.10.final.jar datanucleus-core-1.1.5.jar datanucleus-jpa-1.1.5.jar эти банки находятся в папке lib, а jdo находится в пути к классам и папку lib jdo2-api-2.3-eb.jar   -  person headgrowe    schedule 05.09.2012
comment
конфигурация журнала почему-то не работает ... все еще только ИНФО-сообщения! он находится в папке web-inf/classes и выглядит так: ** log4j.category.DataNucleus.JDO=DEBUG, A1 log4j.category.DataNucleus.Persistence=DEBUG, A1 log4j.category.DataNucleus.Cache=DEBUG, A1 log4j. category.DataNucleus.MetaData=DEBUG, A1 log4j.category.DataNucleus.General=DEBUG, A1 log4j.category.DataNucleus.Utility=DEBUG, A1 log4j.category.DataNucleus.Transaction=DEBUG, A1 log4j.category.DataNucleus.Datastore= ОТЛАДКА, A1 ...**   -  person headgrowe    schedule 05.09.2012
comment
v2.x — это установка Google по умолчанию (с SDK 1.7.1) code.google. com/p/datanucleus-appengine/wiki/   -  person DataNucleus    schedule 05.09.2012
comment
спасибо, я воссоздал проект gae в eclipse (datanucleus-api-jdo-3.0.7.jar/jdo-api-3.1-SNAPSHOT-20110926.jar...), и теперь, я думаю, он работает :) большое спасибо: )   -  person headgrowe    schedule 05.09.2012


Ответы (2)


решение всегда состоит в том, чтобы использовать новый persistanceManager для каждой транзакции. никогда не используйте pm!!

person headgrowe    schedule 18.12.2012

Журнал, если я пытаюсь добавить комментарий, и он НЕ работает

05.09.2012 15:02:06 org.datanucleus.jdo.metadata.JDOMetaDataManager$MetaDataRegisterClassListener registerClass
INFO: Listener found initialisation for persistable class com.Comment
05.09.2012 15:02:06 org.datanucleus.store.appengine.MetaDataValidator validate
INFO: Performing appengine-specific metadata validation for com.Comment
05.09.2012 15:02:06 org.datanucleus.store.appengine.MetaDataValidator validate
INFO: Finished performing appengine-specific metadata validation for com.Comment
Comment [systemId=null, text=testAddCommentToBle - comment , createdTimestamp=1346850126819, JDO-Status=hollow/persistent-nontransactional]

журнал, если я пытаюсь добавить комментарий, и он работает

05.09.2012 15:00:25 org.datanucleus.jdo.metadata.JDOMetaDataManager$MetaDataRegisterClassListener registerClass
INFO: Listener found initialisation for persistable class com.Comment
05.09.2012 15:00:26 org.datanucleus.store.appengine.MetaDataValidator validate
INFO: Performing appengine-specific metadata validation for com.Comment
05.09.2012 15:00:26 org.datanucleus.store.appengine.MetaDataValidator validate
INFO: Finished performing appengine-specific metadata validation for com.Comment
Comment [systemId=Project(1)/Comment(6), text=testAddCommentToBle - comment , createdTimestamp=1346850025996, JDO-Status=hollow/persistent-nontransactional]

метод добавления выглядит следующим образом.

public Boolean addCommentToBle(Key systemKey, Comment comment)
        throws Exception {
    PersistenceManagerFactory PMF = PersistenceUtil.getPersistenceManagerFactory();
    PersistenceManager pm = PMF.getPersistenceManager();
    pm.currentTransaction().begin();
    Ble ble= pm.getObjectById(Ble.class, systemKey);
    System.out.println(ble);
    ble.getComments().add(comment);
    pm.makePersistent(ble);
    pm.currentTransaction().commit();
    return true;
}
person headgrowe    schedule 05.09.2012