从远程客户端查询选择到 apache cayenne 服务器时,我遇到以下问题。
出于测试目的,我只从一张表中生成了一个独立的类。我生成了客户端类(超类和子类)和服务器类。我启动了服务器,如 cayenne 教程中所示。日志告诉我一切都很好。现在我尝试与客户端连接,如 cayenne 教程中所示:
ClientConnection connection = new HessianConnection(
"http://localhost:8080/hdlist_cayeene_javafx/cayenne-service");
DataChannel channel = new ClientChannel(connection);
ObjectContext context = new CayenneContext(channel);
SelectQuery select = new SelectQuery(Source.class);
List<Source> sources= context.performQuery(select);
System.out.println(sources);
说到这条线:
List<Source> sources= context.performQuery(select);
然后我得到一个像这样的异常: java.lang.NoSuchFieldException: id at java.lang.Class.getDeclaredField(Class.java:1899) at org.apache.cayenne.reflect.FieldAccessor.lookupFieldInHierarchy(FieldAccessor.java:156) at org.apache.cayenne.reflect.FieldAccessor.lookupFieldInHierarchy(FieldAccessor.java:165) at org.apache.cayenne.reflect.FieldAccessor.prepareField(FieldAccessor.java:103) at org.apache.cayenne.reflect.FieldAccessor.(FieldAccessor .java:49) 在 org.apache.cayenne.reflect.PersistentDescriptorFactory.createAccessor(PersistentDescriptorFactory.java:355) 在 org.apache.cayenne.reflect.PersistentDescriptorFactory.createAttributeProperty(PersistentDescriptorFactory.java:147)
关于它的疯狂之处在于,当我清空“源”表时,一切正常,我毫无例外地得到一个空列表。
我也不清楚我可以查询我的类集中的所有 10 个对象,并且异常总是命中所选类的第一个属性。如果我研究这些课程,那么该领域就在那里。它们位于 cayenne 建模器生成的抽象类中,并且具有异常给出的确切名称。
这是客户端上的源类:
public abstract class _Source extends PersistentObject {
public static final String ID_PROPERTY = "id";
public static final String NAME_PROPERTY = "name";
protected Long id;
protected String name;
public Long getId() {
if(objectContext != null) {
objectContext.prepareForAccess(this, "id", false);
}
return id;
}
public void setId(Long id) {
if(objectContext != null) {
objectContext.prepareForAccess(this, "id", false);
}
Object oldValue = this.id;
this.id = id;
// notify objectContext about simple property change
if(objectContext != null) {
objectContext.propertyChanged(this, "id", oldValue, id);
}
}
public String getName() {
if(objectContext != null) {
objectContext.prepareForAccess(this, "name", false);
}
return name;
}
public void setName(String name) {
if(objectContext != null) {
objectContext.prepareForAccess(this, "name", false);
}
Object oldValue = this.name;
this.name = name;
// notify objectContext about simple property change
if(objectContext != null) {
objectContext.propertyChanged(this, "name", oldValue, name);
}
}
}
这是相应的服务器类:
public abstract class _Source extends CayenneDataObject {
public static final String ID_PROPERTY = "id";
public static final String NAME_PROPERTY = "name";
public static final String ID_PK_COLUMN = "ID";
public void setId(Long id) {
writeProperty("id", id);
}
public Long getId() {
return (Long)readProperty("id");
}
public void setName(String name) {
writeProperty("name", name);
}
public String getName() {
return (String)readProperty("name");
}
}
我在 Jetty WebServer 上使用 Cayenne Server 和 Client 3.0RC3,如 cayenne 教程中所示。
有谁知道为什么会发生这种异常?