我有对象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)
答案 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;
......看起来像你的情况