Столкнулся со следующей проблемой, имеется объект который нужно сохранить в двух различных базах (локальной и удалённой). Объект является хранилищем или пакетом для хранения других объектов различных классов, так как 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(); } }
|