我已经使用映射表属性在员工和部门表之间建立了多对多关系,它是按名称Employee_department生成的第三个表,Employee_department表中为什么liferay通过名称CompanyId生成一个额外的列,并且在持久性Impl类中导致错误。
<service-builder package-path="com_m2" auto-namespace-tables="false">
<namespace>emp</namespace>
<entity name="Employee" local-service="true" remote-service="false" table="Employee" uuid="true">
<column name="eid" type="long" primary="true"></column>
<column name="name" type="String"></column>
<column name="address" type="String"></column>
<column name="deptid" type="Collection" entity="Department" mapping-table="Employee_department"/>
</entity>
<entity name="Department" local-service="true" remote-service="false" table="Department" uuid="true">
<column name="deptid" type="long" primary="true"></column>
<column name="department" type="String"></column>
<column name="eid" type="Collection" entity="Employee" mapping-table="Employee_department"/>
</entity>
</service-builder>
-------------------------------------------------------------------------------
create table Employee_department (
CompanyId LONG not null,
deptid LONG not null,
eid LONG not null,
primary key (deptid, eid)
);
Liferay API中的"公司"可以在UI上找到为"虚拟实例":您可以拥有多个完全独立的数据集合,用于多租户。
我不确定为什么在您的两个实体没有这样的字段时生成该字段 - 这可能是一个错误。但它指出了您可以做些什么来将您的实体混合到Liferay的股票实体中。这将使Liferay的资产和信息框架更容易使用它们。
一个全新的(和不同的)解决方案是利用Liferay对象并使用客户端代码 - 但这只是为了完整性,而不是你所要求的。
您在service.xml
中定义了两个实体,但服务构建器将创建 3 个表,第三个是映射映射员工和部门主键的表。
该表将分别保存您的员工和部门的记录。因此,当您getEmployeeDepartment(employeeId)
它将返回部门列表,反之亦然。
更新我能够通过Liferay Dev社区在本主题中找到相同的错误 这里 https://liferay.dev/ask/questions/development/re-service-builder-persistance-impl-errors-in-case-of-tablemapper-5
添加列后应解决此问题<column name="companyId" type="long" />
到这两个实体中。