2016-01-27 2 views
0

Les collections de mes entités ne sont pas conservées, qu'il s'agisse d'une collection simple ou d'une association.
J'utilise OGM avec mongodb.Collections manquantes dans les entités utilisant Hibernate OGM avec mongodb

Pour un exemple du problème considérer les entités suivantes:

@Entity 
class Document { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Type(type = "objectid") 
    String id; 

    String name; 

    @ElementCollection 
    Set<String> names; 

    Document() { 
     this.names = new HashSet<>(); 
    } 

    Document(String name) { 
     this(); 
     this.name = name; 
    } 
} 

@Entity 
class ChildDocument { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Type(type = "objectid") 
    String id; 

    String name; 

    ChildDocument() {} 

    ChildDocument(String name) { 
     this.name = name; 
    } 
} 

class ParentDocument { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Type(type = "objectid") 
    String id; 

    int count; 

    @OneToMany(cascade = CascadeType.ALL) 
    @AssociationStorage(AssociationStorageType.IN_ENTITY) 
    List<ChildDocument> kids = new LinkedList<>(); 
} 

La configuration suivante:

final StandardServiceRegistryBuilder registryBuilder = new StandardServiceRegistryBuilder() 
     .applySetting(OgmProperties.ENABLED, true) 
     .applySetting(AvailableSettings.TRANSACTION_COORDINATOR_STRATEGY, "jta") 
     .applySetting(AvailableSettings.JTA_PLATFORM, "JBossTS") 
     .applySetting(OgmProperties.DATASTORE_PROVIDER, MongoDB.DATASTORE_PROVIDER_NAME) 
     .applySetting(OgmProperties.DATABASE, "testdb") 
     .applySetting(OgmProperties.CREATE_DATABASE, "true"); 

final StandardServiceRegistry registry = registryBuilder.build(); 
final MetadataSources sources = new MetadataSources(registry); 
sources.addAnnotatedClass(Document.class); 
sources.addAnnotatedClass(ChildDocument.class); 
sources.addAnnotatedClass(ParentDocument.class); 

final SessionFactory sessionFactory = sources.buildMetadata().getSessionFactoryBuilder() 
     .unwrap(OgmSessionFactoryBuilder.class) 
     .build(); 

Ce programme court:

Document document1 = new Document("one"); 
Document document2 = new Document("two"); 
document2.names.add("one.one"); 
document2.names.add("one.two"); 

ParentDocument parent = new ParentDocument(); 
parent.count = 2; 
parent.kids.add(new ChildDocument("one")); 
parent.kids.add(new ChildDocument("two")); 

final Session session = sessionFactory.openSession(); 
session.save(document1); 
session.save(document2); 
session.save(parent); 
session.close(); 

sessionFactory.close(); 

Le testdb contient maintenant 3 collections: Document, ChildDocument et ParentDocument.

  • Les documents sont corrects ChildDocument car ils ne doivent avoir les _id et name
  • Les contiennent également Document seuls les documents _id et name, la collection names manque
  • En ParentDocument seulement le _id et count sont persistés mais la référence aux enfants est manquante même si les ChildDocuments sont créés

Qu'est-ce que je fais mal?
Merci

Répondre

1

Hibernate OGM sous le capot exécuter quelques optimisations et donc les commandes ne sont pas exécutées immédiatement sur la base de données (habituellement).

Lorsque vous utilisez Hibernate OGM, vous devriez toujours utiliser la démarcation des transactions pour vos opérations:

final Session session = sessionFactory.openSession(); 

    session.beginTransaction(); 

    session.save(document1); 
    session.save(document2); 
    session.save(parent); 

    session.getTransaction().commit(); 

    session.close(); 

Ceci est expliqué dans la documentation: http://docs.jboss.org/hibernate/ogm/5.0/reference/en-US/html/ch11.html#transactions

Notez que l'utilisation session.flush() avant session.close() fonctionnerait aussi bien dans ce cas .