google-code-export / morphia

Automatically exported from code.google.com/p/morphia
1 stars 0 forks source link

Pb with composite id and references #400

Open GoogleCodeExporter opened 9 years ago

GoogleCodeExporter commented 9 years ago
morphia 0.99.1
mongo 2.7.3

My Model is :

@XmlRootElement
@Entity
public class SubDomain implements Persistent{

    /**
     * Internal object Id (autogenerated)
     */
    @Id
    private PK id;

    private String name;

    @XmlTransient
    @Reference
    private Domain parent;

    @XmlTransient
    @Reference
    private Domain subdomain;

...

@Entity
public class Domain implements Persistent {

    /**
     * Internal object Id (autogenerated)
     */
    @Id
    private PK id;

    private String name;

...

public class PK {

    private String appId;

    private String objId;
...

My TestCase :

        String appId = "1";
        Domain parent = domainService.store(appId, new Domain("test1", null));
        Domain subdomain = domainService.store(appId, new Domain("test2", null));
        subdomainService.store(appId, new SubDomain("name", parent, subdomain, null));

Stacktrace :

java.lang.IllegalArgumentException: can't serialize class com.....PK
    at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:234)
    at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:140)
    at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:224)
    at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:140)
    at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:86)
    at com.mongodb.DefaultDBEncoder.writeObject(DefaultDBEncoder.java:27)
    at com.mongodb.OutMessage.putObject(OutMessage.java:142)
    at com.mongodb.DBApiLayer$MyCollection.update(DBApiLayer.java:346)
    at com.mongodb.DBCollection.update(DBCollection.java:165)
    at com.mongodb.DBCollection.save(DBCollection.java:736)
    at com.google.code.morphia.DatastoreImpl.save(DatastoreImpl.java:772)
    at com.google.code.morphia.DatastoreImpl.save(DatastoreImpl.java:834)
    at com.google.code.morphia.DatastoreImpl.save(DatastoreImpl.java:828)

The error occurs when the "SubDomain" object is stored.
The "Domain" objects are stored OK with the right composite PK.

I also found out that the SubDomain is stored is PK extends ObjectId (but it 
builds a complex _id object).

Do you have any idea?
Am I doing something wrong? 

Original issue reported on code.google.com by obalb...@gmail.com on 28 Mar 2012 at 8:59

GoogleCodeExporter commented 9 years ago
Sorry, let me explain the test case SubDomain storage :

        Domain parent = domainService.store(appId, new Domain("test1", null));
        Domain subdomain = domainService.store(appId, new Domain("test2", null));

        SubDomain subDomain = new SubDomain("name", parent, subdomain, null);
        subDomain.setId(new PK(appId, new ObjectId().toString()));
        MongoDBHelper.getDatastore().save(subDomain);

Note that if I set the referenced fields (parent ane subdomain) to null, the 
test passes.

Original comment by obalb...@gmail.com on 28 Mar 2012 at 9:51

GoogleCodeExporter commented 9 years ago
The problem looks to be the last line in DefaultMapper.keyToRef:
return new DBRef(null, key.getKind(), key.getId());

The key id should be serialized before being placed in the DBRef

Test case demonstrating the problem here:
https://github.com/jmkgreen/morphia/pull/10

Original comment by benjamin...@gmail.com on 4 Nov 2012 at 7:05