使用Gilead持久化继承类

时间:2009-08-21 20:54:37

标签: java hibernate gwt gilead

我正在使用Gilead将我的实体保留在我的GWT项目中,而且我遇到了一个问题。我想创建一个父类来保存我的实体(id等)中常见的一些属性。持久化时,我得到一个空指针异常。

家长班:

public abstract class Entity extends LightEntity implements Serializable {
    protected Long id;
    public Entity(){}
}

儿童班:

public class Person extends Entity  {
    private String firstName;
    private String lastName;
    public Person(){}
}

Hibernate映射文件:

<hibernate-mapping>
    <class name="com.domain.Entity" abstract="true" >
        <id name="id" type="long">
                <column name="ID"/>
                <generator class="native" />
            </id>
        <union-subclass name="com.domain.Person" table="PERSON">
            <property name="id" type="long" />
            <property name="firstName" type="string">
                <column name="FIRST_NAME" length="45" not-null="true" />
            </property>
            <property name="lastName" type="string">
                <column name="LAST_NAME" length="45" not-null="true" />
            </property>
        </union-subclass>
    </class>
</hibernate-mapping>

持久化时的堆栈跟踪:

  

显示java.lang.NullPointerException           在net.sf.gilead.gwt.PersistentRemoteService.processCall(PersistentRemoteService.java:170)           在com.google.gwt.user.server.rpc.RemoteServiceServlet.doPost(RemoteServiceServlet.java:86)           在javax.servlet.http.HttpServlet.service(HttpServlet.java:754)           在javax.servlet.http.HttpServlet.service(HttpServlet.java:847)           在org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:427)           在org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:315)           at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:287)           在org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:218)           在org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648)           在org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593)           在com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:94)           在com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:98)           在org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:222)           在org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648)           在org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593)           在org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:587)           在org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1096)           在org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:166)           在org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648)           在org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593)           在org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:587)           在org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1096)           在org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:288)           在com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.invokeAdapter(DefaultProcessorTask.java:647)           在com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:579)           在com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.process(DefaultProcessorTask.java:831)           at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask(DefaultReadTask.java:341)           在com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:263)           在com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:214)           at com.sun.enterprise.web.portunif.PortUnificationPipeline $ PUTask.doTask(PortUnificationPipeline.java:380)           在com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:265)           在com.sun.enterprise.web.connector.grizzly.ssl.SSLWorkerThread.run(SSLWorkerThread.java:106)

2 个答案:

答案 0 :(得分:3)

您使用的是Gilead &lt; 1.2.2?

如果是,请升级Gilead 。然后再次运行并检查新的异常消息。很可能只是某种错误配置。

完整说明:

如果您在版本1.2.1中检查PersistentRemoteService.java的源代码

PersistentRemoteService.java v1.2.1

在第170行,您会看到以下行

return RPCCopy.getInstance().encodeResponseForFailure(null, ex, rpcRequest.getSerializationPolicy());

如果NullPointerException为空,则rpcRequest显然会失败。

在第143行中发生这种情况

// Decode request
rpcRequest = RPCCopy.getInstance().decodeRequest(payload, this.getClass(), this);

decodeRequest - 方法会抛出IncompatibleRemoteServiceException。它在你的情况下做了什么。

从版本1.2.2开始,第170行变为

if (rpcRequest != null)
{
  return RPCCopy.getInstance().encodeResponseForFailure(null, ex, rpcRequest.getSerializationPolicy());
}
else
{
    return RPCCopy.getInstance().encodeResponseForFailure(null, ex);
}

现在你应该得到正确的异常(IncompatibleRemoteServiceException),这可以指出真正的问题。

您还可以在SVN中检查相应的提交/修复

Bad exception fix (issue 2663344)

以及Bug-Tracker for Gilead

中的相应问题条目

Wrong exception

所以这个问题自2009年2月7日起或自吉利德版本1.2.2(2009年3月13日)以来在SVN中得到解决

答案 1 :(得分:0)

不确定是否有帮助。只是猜测。你尝试过非抽象超类吗?有时在序列化之前手动取消/急切地加载惰性对象引用或列表(当然在当前事务范围之外)只是起作用,而且不需要Gilead。