Где объявить JDO Singleton PersistenceManagerFactory с несколькими службами - PullRequest
2 голосов
/ 22 апреля 2010

Я работаю с GWT, и у меня есть 4 реализации сервисов, которым нужен PersistenceManagerFactory. Я последовал совету Google по созданию одноэлементного класса, однако я не уверен, где должен быть создан экземпляр этого класса и ссылки в коде на стороне сервера.

Класс выглядит так

import javax.jdo.JDOHelper;
import javax.jdo.PersistenceManagerFactory;

public final class PMF {
    private static final PersistenceManagerFactory pmfInstance =
        JDOHelper.getPersistenceManagerFactory("transactions-optional");

    private PMF() {}

    public static PersistenceManagerFactory get() {
        return pmfInstance;
    }
}

Но выполнение чего-то подобного в каждой реализации службы, по-видимому, в конечном итоге приводит к созданию уникальной копии синглтона на основе полученного сообщения об ошибке: «Код приложения попытался создать PersistenceManagerFactory с именем транзакции-необязательно, но копия с таким именем уже существует ! "

@Override
 public void addCategory(Category category) {
  PersistenceManager pm = PMF.get().getPersistenceManager();
  try {
        pm.makePersistent(category);
  } finally {
       pm.close();
     }
 }

Так что в основном первый ServiceImpl, который вызывает addCategory, в порядке, все остальные терпят неудачу с ошибкой выше. Мне здесь не хватает чего-то жизненно важного, я думал, что весь смысл синглтон-класса заключается в создании статического PersistenceManagerFactory. Любое понимание того, что мне не хватает, очень ценится.

1 Ответ

0 голосов
/ 06 мая 2010

Класс PMF должен быть классом верхнего уровня, а не внутренним классом.

Обычно его site.server.PMF.

...