使用ORM Lite将自定义对象的arraylist存储在数据库中

时间:2015-09-18 10:10:02

标签: java database ormlite

我有对象Guild.class和GuildMember.class。我需要在Guild中存储GuildMembers的ArrayList,并使用ORM Lite将它们处理到数据库。在示例代码中,我找到了注释ForeignCollectionField,但它似乎无法正常工作

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;
    }
}

结果我得到了

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)

1 个答案:

答案 0 :(得分:1)

希望 - 这会对您有所帮助:https://github.com/j256/ormlite-jdbc/tree/master/src/test/java/com/j256/ormlite/examples/foreignCollection

查看自述文件并使用其外部参数检查类Order,即:

    @DatabaseField(foreign = true, foreignAutoRefresh = true, columnName = ACCOUNT_ID_FIELD_NAME)
    private Account account;

......看起来像你的情况