2017-01-09 3 views
1

je veux interroger un mongodb ici mon codeMongoDB mise en veille prolongée ogm l'interrogation retourne toujours NULL

persistence.xml

<?xml version="1.0"?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
    version="2.0"> 

    <persistence-unit name="primary" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.hibernate.ogm.jpa.HibernateOgmPersistence</provider> 
     <properties> 
     <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossStandAloneJtaPlatform"/> 
      <property name="hibernate.ogm.datastore.provider" value="mongodb" /> 
      <property name="hibernate.ogm.datastore.database" value="******" /> 
      <property name="hibernate.ogm.datastore.host" value="******" /> 
      <property name="hibernate.ogm.datastore.port" value="******" /> 
      <property name="hibernate.ogm.datastore.username" value="******" /> 
      <property name="hibernate.ogm.datastore.password" value="******" /> 
     </properties> 
    </persistence-unit> 
</persistence> 

Flux.java

@Entity 
@Table(catalog="f12", schema="public", name="enl_flux_f12_entry") 
public class enl_flux_f12_entry{ 

    @Id 
    public String id; 

    public String SYS_FluxName; 
    public byte[] SYS_ReadDateTime; 
    public String SYS_BaseNameZip; 
    public Long SYS_Status; 
    public String SYS_DateCreaERDF; 
} 

principale

public static void main(String[] args) throws ClassNotFoundException{ 

     EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("primary"); 
     EntityManager entityManager = entityManagerFactory.createEntityManager(); 
     entityManager.getTransaction().begin(); 
     enl_flux_f12_entry f = entityManager.find(Flux.class, "*id*"); 
     System.out.println(f.id); 
     entityManager.flush(); 
     entityManager.close(); 
    } 

mongodb

{ 
    "_id" : ObjectId("rzerzer"), 
    "SYS_FluxName" : "zerzerze.xml", 
    "SYS_ReadDateTime" : Timestamp(6300883749567463, 83), 
    "SYS_BaseNameZip" : "rferfer.zip", 
    "SYS_Status" : NumberLong(1), 
    "SYS_DateCreaERDF" : "2016-03-01T20:38:48Z" 
} 

Le problème est que entityManager.find retourne toujours NULL. Y a-t-il un problème dans mon code?

Répondre

0

Je pense qu'il renvoie null parce que quelque chose d'étrange dans le mappage ou dans l'objet JSON et il ne peut pas trouver l'entité que vous recherchez.

L'objet JSON vous souhaitez obtenir a _id: ObjectId("rzerzer"), cela ne regarde pas droit parce an ObjectId in MongoDB should be:

The 12-byte ObjectId value consists of: 

a 4-byte value representing the seconds since the Unix epoch, 
a 3-byte machine identifier, 
a 2-byte process id, and 
a 3-byte counter, starting with a random value. 

Même si l'objet de la DB est droite, elle est mappée comme une chaîne, ainsi Hibernate OGM n'attend pas d'ObjectId.

La mise en correspondance de l'identifiant de l'entité doit être:

@Id 
@Type(type = "objectid") 
public String id; 

ou

@Id 
public ObjectId id; 

Une autre chose étrange est la façon dont vous utilisez find:

enl_flux_f12_entry f = entityManager.find(Flux.class, "*id*"); 

le find La méthode requiert l'identifiant exact de l'entité. Si la mise en correspondance est juste, cela devrait fonctionner entityManager.find(Flux.class, "rzerzer");

Si vous n'êtes pas sûr de l'identifiant dans le db, vous pouvez également utiliser HQL:

List<Flux> entries = entityManager.createQuery("from Flux").list(); 
+0

thx pour votre réponse. J'ai réparé tous ces problèmes mais il reste l'horodatage. Quel type dois-je mettre à SYS_ReadDateTime –

+0

Horodatage ne sont pas pris en charge par Hibernate OGM pour le moment. Vous pouvez essayer de le mapper en tant que chaîne – Davide

+0

non cela ne fonctionne pas: Impossible de définir le champ java.lang.String .... à org.bson.types.BSONTimestamp –