Liferays Service Builder - 多对多关系

时间:2011-06-08 12:28:52

标签: java entity-relationship liferay

我试图在我自己的实体和liferay Group实体之间创建many-to-many。我的service.xml看起来像这样

<entity name="EntityA" local-service="true" remote-service="false">

    <column name="entityAId" type="long" primary="true" />

    <column name="title" type="String" />
    <column name="summary" type="String" />
    <column name="authorId" type="long" />

    <column name="attachments" type="Collection" entity="EntityAAttachment" mapping-key="entityAId" />
    <column name="groups" type="Collection" entity="com.liferay.portal.Group" mapping-table="EntityAs_Groups" />

</entity>

根据service.xml的DTD,这应该生成多对多关系,但我只能得到这个

Method public java.util.List com.liferay.portal.tools.servicebuilder.ServiceBuilder.getMappingEntities(java.lang.String) throws java.io.IOException threw an exception when invoked on com.liferay.portal.tools.servicebuilder.ServiceBuilder@21ff3fcf
The problematic instruction:
----------
==> list serviceBuilder.getMappingEntities(column.mappingTable) as mapColumn [on line 201, column 49 in com/liferay/portal/tools/servicebuilder/dependencies/model_impl.ftl]
----------
Java backtrace for programmers:
----------
freemarker.template.TemplateModelException: Method public java.util.List com.liferay.portal.tools.servicebuilder.ServiceBuilder.getMappingEntities(java.lang.String) throws java.io.IOException threw an exception when invoked on com.liferay.portal.tools.servicebuilder.ServiceBuilder@21ff3fcf
    at freemarker.ext.beans.SimpleMethodModel.exec(SimpleMethodModel.java:130)
    at freemarker.core.MethodCall._getAsTemplateModel(MethodCall.java:93)
    at freemarker.core.Expression.getAsTemplateModel(Expression.java:89)
    at freemarker.core.IteratorBlock.accept(IteratorBlock.java:94)
    at freemarker.core.Environment.visit(Environment.java:210)
    at freemarker.core.MixedContent.accept(MixedContent.java:92)
    at freemarker.core.Environment.visit(Environment.java:210)
    at freemarker.core.Environment.visit(Environment.java:299)
    at freemarker.core.CompressedBlock.accept(CompressedBlock.java:73)
    at freemarker.core.Environment.visit(Environment.java:210)
    at freemarker.core.MixedContent.accept(MixedContent.java:92)
    at freemarker.core.Environment.visit(Environment.java:210)
    at freemarker.core.IfBlock.accept(IfBlock.java:82)
    at freemarker.core.Environment.visit(Environment.java:210)
    at freemarker.core.MixedContent.accept(MixedContent.java:92)
    at freemarker.core.Environment.visit(Environment.java:210)
    at freemarker.core.ConditionalBlock.accept(ConditionalBlock.java:79)
    at freemarker.core.Environment.visit(Environment.java:210)
    at freemarker.core.IteratorBlock$Context.runLoop(IteratorBlock.java:179)
    at freemarker.core.Environment.visit(Environment.java:417)
    at freemarker.core.IteratorBlock.accept(IteratorBlock.java:102)
    at freemarker.core.Environment.visit(Environment.java:210)
    at freemarker.core.MixedContent.accept(MixedContent.java:92)
    at freemarker.core.Environment.visit(Environment.java:210)
    at freemarker.core.Environment.process(Environment.java:190)
    at freemarker.template.Template.process(Template.java:237)
    at com.liferay.portal.freemarker.FreeMarkerUtil.process(FreeMarkerUtil.java:49)
    at com.liferay.portal.freemarker.FreeMarkerUtil.process(FreeMarkerUtil.java:39)
    at com.liferay.portal.tools.servicebuilder.ServiceBuilder._processTemplate(ServiceBuilder.java:4447)
    at com.liferay.portal.tools.servicebuilder.ServiceBuilder._createModelImpl(ServiceBuilder.java:2420)
    at com.liferay.portal.tools.servicebuilder.ServiceBuilder.<init>(ServiceBuilder.java:1023)
    at com.liferay.portal.tools.servicebuilder.ServiceBuilder.<init>(ServiceBuilder.java:404)
    at com.liferay.portal.tools.servicebuilder.ServiceBuilder.main(ServiceBuilder.java:176)
Caused by: java.lang.NullPointerException
    at com.liferay.portal.tools.servicebuilder.ServiceBuilder.getMappingEntities(ServiceBuilder.java:1366)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at freemarker.ext.beans.BeansWrapper.invokeMethod(BeansWrapper.java:840)
    at freemarker.ext.beans.SimpleMethodModel.exec(SimpleMethodModel.java:106)
    ... 32 more

我在这里做错了什么?我使用的是最新的Liferay stable 6.0.5

4 个答案:

答案 0 :(得分:0)

这是Liferay中未解决的错误:https://issues.liferay.com/browse/LPS-49769

更改实体的词典顺序可能会解决此问题,但可以解决生成错误的源代码。

Mike Lenox在https://www.liferay.com/community/forums/-/message_boards/message/41347203的潜在解决方法:

  

潜在的解决方法:我有一大堆模型   多对多的映射一直很好。我最终跌跌撞撞   在添加新映射时跨越此错误。我终于注意到了一些   我的关系应该引发错误,但没有   (lexigraphic命令大于)。起初我无法弄明白   为什么旧的工作,但新的失败。事实证明,如果   你在目标实体中有多对多的向后构建器   工作正常。

     

例如,将fooList属性添加到FooBar以对应于   Foo中的fooBarList,都使用相同的映射表..

     

我认为这只适用于2个自定义实体,除非你   修改LR。

另一种解决方法是将自己的映射定义为实体,如http://blog.d-vel.com/home/-/blogs/service-builder-e-relazioni-many-to-many所示(意大利语):

<entity name="Autore_Libro" local-service="true">
 <column name="autoreId" type="long" primary="true" />
 <column name="libroId" type="long" primary="true" />
</entity>

答案 1 :(得分:0)

我很确定您不能在您的实体和门户网站实体之间建立一对多或多对多的关系。至少不直接使用Service Builder。考虑到您的portlet和门户是单独的上下文。

正如其他答案所述,不。永远不要搞乱portal-impl.jar。非常沮丧。

我建议模拟实现EntityAServiceImpl和EntityALocalServiceImpl类中所需方法的这种关系。我认为这将是最干净的方式。

看看这个..

https://dev.liferay.com/develop/tutorials/-/knowledge_base/6-2/writing-local-service-classes

希望有所帮助

答案 2 :(得分:-1)

Lferay组实体,服务和实现都在portal-impl.jar中,它位于ROOT / web-inf / lib下,所以如果你试图使用那个实体,它们的实现和服务超出范围,那么你有两个选择,要么将portal-impl移动到运行时的全局类路径(这是一个糟糕的选择导致你必须移动所有其他的lib),要么将portal-impl移动到你的portlet类路径(这是一个糟糕的选择)太).. 最好的解决方案是使用hook,这样portal-impl就可以访问..然后将服务构建器生成的lib移动到服务器tomcat / lib / ext的全局类路径,这样它就会在你的portlet.it对我来说很好。 在封闭实体之前添加引用

<reference package-path="com.liferay.portal" entity="Group" />
  1. 部署钩子
  2. 它将生成必要的表格
  3. 停止tomcat
  4. 将lib移动到全局类路径
  5. 重启Tomcat

答案 3 :(得分:-2)

有关Liferay Servie建设者的更多信息,请查看此帖子。

http://liferaydemystified.blogspot.com/2011/04/mvc-portlet-development-service-builder.html