2015-09-18 1 views
1

J'ai l'objet Guild.class et GuildMember.class. J'ai besoin de stocker ArrayList de GuildMembers dans Guild et les traiter à la base de données en utilisant ORM Lite. Dans le code exemple que j'ai trouvé l'annotation ForeignCollectionField mais il ne semble pas fonctionner correctementEnregistrer l'arborescence d'objets personnalisés dans la base de données à l'aide d'ORM Lite

Guild.java

package skymine.redenergy.clansreloaded.server.entities; 

import java.util.ArrayList; 
import java.util.Collection; 
import java.util.UUID; 

import com.j256.ormlite.dao.ForeignCollection; 
import com.j256.ormlite.field.DatabaseField; 
import com.j256.ormlite.field.ForeignCollectionField; 
import com.j256.ormlite.table.DatabaseTable; 

@DatabaseTable(tableName = "guilds") 
public class Guild { 

    @DatabaseField(id = true) 
    private UUID uid; 

    @DatabaseField(canBeNull = false) 
    private String title; 

    @ForeignCollectionField 
    public Collection<GuildMember> players; 

    public Guild(){} 

    public Guild(String title){ 
     this.title = title; 
     this.uid = UUID.randomUUID(); 
     this.players = new ArrayList<GuildMember>(); 
    } 

    public Collection<GuildMember> getPlayers(){ 
     return players; 
    } 

    public void addPlayer(GuildMember player){ 
     this.players.add(player); 
    } 

    public String getTitle(){ 
     return title; 
    } 

    public Guild setTitle(String newTitle){ 
     this.title = newTitle; 
     return this; 
    } 

    public UUID getUUID(){ 
     return uid; 
    } 
} 

GuildMember.java

package skymine.redenergy.clansreloaded.server.entities; 

import java.util.UUID; 

import com.j256.ormlite.field.DatabaseField; 
import com.j256.ormlite.table.DatabaseTable; 

@DatabaseTable(tableName = "members") 
public class GuildMember { 

    @DatabaseField(id = true) 
    private UUID uid; 

    @DatabaseField(canBeNull = false) 
    private String name; 

    @DatabaseField 
    private int rank; 

    public GuildMember(){} 

    public GuildMember(String name, int rank){ 
     this.name = name; 
     this.rank = rank; 
     this.uid = UUID.randomUUID(); 
    } 

    public String getName(){ 
     return name; 
    } 

    public int getRank(){ 
     return rank; 
    } 

    public UUID getUUID(){ 
     return uid; 
    } 

    public GuildMember setRank(int newRank){ 
     this.rank = newRank; 
     return this; 
    } 
} 

En conséquence, je reçois

java.sql.SQLException: Foreign collection class skymine.redenergy.clansreloaded.server.entities.GuildMember for field 'players' column-name does not contain a foreign field of class skymine.redenergy.clansreloaded.server.entities.Guild 
    at com.j256.ormlite.field.FieldType.findForeignFieldType(FieldType.java:1020) 
    at com.j256.ormlite.field.FieldType.configDaoInformation(FieldType.java:390) 
    at com.j256.ormlite.dao.BaseDaoImpl.initialize(BaseDaoImpl.java:201) 
    at com.j256.ormlite.dao.BaseDaoImpl.<init>(BaseDaoImpl.java:128) 
    at com.j256.ormlite.dao.BaseDaoImpl.<init>(BaseDaoImpl.java:107) 
    at com.j256.ormlite.dao.BaseDaoImpl$4.<init>(BaseDaoImpl.java:907) 
    at com.j256.ormlite.dao.BaseDaoImpl.createDao(BaseDaoImpl.java:907) 
    at com.j256.ormlite.dao.DaoManager.createDao(DaoManager.java:70) 
    at skymine.redenergy.clansreloaded.server.ClanManager.initDatabase(ClanManager.java:23) 
    at skymine.redenergy.clansreloaded.ClanManagerTest.<init>(ClanManagerTest.java:36) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
    at java.lang.reflect.Constructor.newInstance(Unknown Source) 
    at org.junit.runners.BlockJUnit4ClassRunner.createTest(BlockJUnit4ClassRunner.java:217) 
    at org.junit.runners.BlockJUnit4ClassRunner$1.runReflectiveCall(BlockJUnit4ClassRunner.java:266) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.junit.runners.BlockJUnit4ClassRunner.methodBlock(BlockJUnit4ClassRunner.java:263) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 

Répondre