Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема сохранения объекта в двух базах данных, Столкнулся со следующей проблемой, имеет 
:(
    Опции темы
INlHELL
Дата 1.7.2010, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 22.9.2008

Репутация: нет
Всего: нет



Столкнулся со следующей проблемой, имеется объект который нужно сохранить в двух различных базах (локальной и удалённой). Объект является хранилищем или пакетом для хранения других объектов различных классов, так как Hibernate не позволяет напрямую хранить generic коллекции, то при сохранении этого объекта пакета в базу данных сохраняются только UUID этих объектов. 

У объекта имеются следующие поля: 
- UUID(уникальный идентификатор и он же первичный ключ), 
- name(имя объекта), 
- classType (название класса объектов, которые хранятся в коллекции), 
- uuidsOfObjects (UUID объектов). 

Реализован DAO для работы с данным объектом "обёртка" вокруг EntityManagerFactory.

Суть проблемы, коллекция с UUID объектов хранится в Join Table, при сохранении объекта пакета в первую базу данных, всё происходит нормально, а вот при сохранении во вторую в базу, того же объекта, доступны UUID, classType, name, а вот Join Table абсолютна пуста!

Конечно без самого кода понять, о чём речь, сложно, для начала структура класса пакета "VersionedSet":


Код

@Entity
@Table(name = "versionedSet")
@EntityListeners(VersionedSetListener.class)
public class VersionedSet {

  @Id
  @Column(name = "versionedSetUuid", nullable = false)
  @NotAudited
    private String uuid = null;

  @Column(name = "versionedSetName")
  @NotAudited
    private String name = null;

  @Column(name = "versionedSetClassType")
  @NotAudited
    private Class<?> classType = null;

  @CollectionOfElements(
    targetElement = String.class,
    fetch = FetchType.EAGER
  )
  @JoinTable(
    name = "versionedSet_uuidOfObjects",
    joinColumns = @JoinColumn(
      name = "versionedSetUuid",
      nullable = false
    )
  )
  @Column(name="versionedSet_uuidOfObjects")
    private Set<String> uuidsOfObjects = new HashSet<String>();

  @Transient
  @NotAudited
    private final Set<Object> objects = new HashSet<Object>();

  ... 
}



DAO для данного объекта:


Код
public class VersionedSetDAOImpl implements VersionedSetDAO {

  public void insert(VersionedSet versionedSet) {
    EntityManager em = null;
    EntityTransaction et = null;
    try {
      if( versionedSet != null ) {
        em = EntityManagerFactoryWrapper.getInstance().getEntityManagerFactory().createEntityManager();
        et = em.getTransaction();
        et.begin();
        em.persist(versionedSet);
        et.commit();
      }
      else {
        throw new VersionedSetNullException();
      }
    }
    catch (VersionedSetNullException e) {
       e.printStackTrace();
    }
    catch (EntityNotFoundException e) {
      e.printStackTrace();
      if( et != null && et.isActive() == true) {
        em.getTransaction().rollback();
      }
    }
    catch (javax.persistence.PersistenceException e) {
      e.printStackTrace();
      if( et != null && et.isActive() == true&& em.getTransaction().isActive() == true) {
        em.getTransaction().rollback();
      }
    }
    catch (Exception e) {
      if( et != null && et.isActive() == true) {
        em.getTransaction().rollback();
      }
       e.printStackTrace();
    }
    finally {
      if( em != null ) {
        em.clear();
        em.close();
      }
    }
  }
  ...
}



"обёртка" для EntityManagerFactory:


Код
public class EntityManagerFactoryWrapper {
  private static EntityManagerFactoryWrapper _instance     = null;
  private EntityManagerFactory               emf           = null;
  private DatabaseFactory                    configuration = null;

  private EntityManagerFactoryWrapper() {}

  public static EntityManagerFactoryWrapper getInstance() {
    if(_instance == null) {
      _instance = new EntityManagerFactoryWrapper();
    }
    return _instance;
  }

  public void createEntityManagerFacotry(DatabaseFactory configuration) {
    this.configuration = configuration;
    emf = configuration.configure().buildEntityManagerFactory();
  }

  public EntityManagerFactory getEntityManagerFactory() throws HibernateException {
    if(emf == null) {
      emf = configuration.configure().buildEntityManagerFactory();
    }
    return emf;
  }

  public void closeEntityManagerFactory() {
    if(emf != null) {
      try {
        emf.close();
        emf = null;
        System.gc();
      }
      catch(Exception e) {
      }
    }
  }
}



Ну и собственно тестовое приложение:


Код
public class App6_Workflow {
  private static final Logger log = Logger.getLogger(App6_Workflow.class);

  public static void main(String[] args) {
    ...
    
    Location l1 = new Location("L1");
    Location l2 = new Location("L2");
    Location l3 = new Location("L3");
    Location l4 = new Location("L4");

    VersionedSet vsOfLocations = new VersionedSet("VS OF LOCATIONS 1");
    
    vsOfLocations.setObjects(l1, l2, l3, l4);



    EntityManagerFactoryWrapper.getInstance().createEntityManagerFacotry(remoteConfiguration);

    VersioningFactory.getInstance().getVersionedSetDAO()
        .insert(vsOfLocations);

    EntityManagerFactoryWrapper.getInstance().closeEntityManagerFactory();


    
    EntityManagerFactoryWrapper.getInstance().createEntityManagerFacotry(localConfiguration);

    VersioningFactory.getInstance().getVersionedSetDAO()
        .insert(vsOfLocations);

    EntityManagerFactoryWrapper.getInstance().closeEntityManagerFactory();
  }
}

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0593 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.