留言板

Service Builder: mapping-key und db-name

Dima Morosjuk,修改在10 年前。

Service Builder: mapping-key und db-name

New Member 帖子: 4 加入日期: 13-8-26 最近的帖子
Hallo Zusammen,

ich möchte meine Frage anhand des folgenden Beispiels formulieren:

[indent]
<entity name="SalesHeader" remote-service="false" local-service="true">
<column name="SalesHeaderId" type="long" primary="true" id-type="identity"></column>
<column name="Name" type="String" />
<column name="Lieferort" type="String"></column>
<column name="Lieferdatum" type="Date"></column>
<column name="Items" type="Collection" entity="SalesLine" mapping-key="SalesHeaderId"></column>
</entity>

<entity name="SalesLine" local-service="true" remote-service="false">
<column name="SalesLineId" type="long" primary="true" id-type="identity"></column>
<column name="ItemName" type="String"></column>
<column name="ItemBeschreibung" type="String"></column>
<column name="SalesHeaderId" type="long" db-name="fk_SalesHeaderId"></column>
</entity>
[/indent]

Die fett markierte Zeile in der Entität SalesHeader beschreibt eine 1:n-Relation zu SalesLine über die Spalte "SalesHeaderId". Diese Spalte hat allerdings das db-name-Attribut gesetzt. Meine Frage ist: Was setzte ich im SalesHeader im mapping-key-Attribut? Den Namen der Spalte, also "SalesHeaderId", oder den Namen des db-name-Attributs, also "fk_SalesHeaderId"? Oder sind beide Werte valide?

Danke, falls einer hierfür eine Antwort findet.

Grüße,
Dima.
thumbnail
Jan Geißler,修改在10 年前。

RE: Service Builder: mapping-key und db-name

Liferay Master 帖子: 735 加入日期: 11-7-5 最近的帖子
Hi Dima!

Aus der Service Builder DTD


If the entity and mapping-key attributes are specified and mapping-table is not,
then the Service Builder will assume you are specifying a one to many
relationship.

For example:

<column name="shoppingItemPrices" type="Collection" entity="ShoppingItemPrice" mapping-key="itemId" />

The above column specifies that there will be a getter called
pojo.getShoppingItemPrices() that will return a collection. It will map to a
column called itemId in the table that maps to the entity ShoppingItemPrice.

If the entity and mapping-table attributes are specified and mapping-key is not,
then the Service Builder will assume you are specifying a many to many
relationship.

For example:

<column name="roles" type="Collection" entity="Role" mapping-table="Groups_Roles" />

The above column specifies that there will be a getter called
pojo.getRoles() that will return a collection. It will use a mapping table
called Groups_Roles to give a many to many relationship between groups and
roles.

If you are creating a mapping table for an entity defined in another
service.xml, you need to specify the full package path.

For example:

<column name="organizations" type="Collection" entity="com.liferay.portal.Organization" mapping-table="Foo_Organizations" />


Ich hoffe das hilft dir weiter.
Mehr kann ich dazu nicht sagen, da ich das noch nie ausprobiert habe. Aber wenn du da was hinkriegst, kannst du deine Befunde posten? ;)

Gruß
Jan
Dima Morosjuk,修改在10 年前。

RE: Service Builder: mapping-key und db-name

New Member 帖子: 4 加入日期: 13-8-26 最近的帖子
Hallo Jan,

mapping-key und db-name scheinen überhaupt nicht miteinander zu funktionieren.

Bei folgender service.xml:



<!--?xml version="1.0" encoding="UTF-8"?-->

<service-builder package-path="com.test">
	<author>Donny</author>
	<namespace>mappingtest</namespace>
    <entity name="SalesHeader" remote-service="false" local-service="true">
        <column name="salesheaderId" type="long" primary="true" id-type="identity"></column>
        <column name="adresse" type="String"></column>
        <column name="salesLines" entity="SalesLine" type="Collection" mapping-key="salesheaderId" />
        <column name="groupId" type="long" />
        <column name="companyId" type="long" />
        
        <finder name="GroupId" return-type="Collection">
      		<finder-column name="groupId" />
	    </finder>
	
	    <finder name="CompanyId" return-type="Collection">
	      	<finder-column name="companyId" />
	    </finder>
    </entity>
    <entity name="SalesLine" local-service="true" remote-service="false">
        <column name="saleslineId" type="long" primary="true" id-type="identity"></column>
        <column name="itemName" type="String"></column>
        <column name="salesheaderId" type="long" db-name="othername" />
        <column name="groupId" type="long" />
        <column name="companyId" type="long" />
        <finder name="GroupId" return-type="Collection">
      		<finder-column name="groupId" />
	    </finder>
	
	    <finder name="CompanyId" return-type="Collection">
	      	<finder-column name="companyId" />
	    </finder>
    </entity>
</service-builder>



erhalte ich durch den Aufruf salesHeaderPersistence.getSalesLines(salesheaderId) folgende Fehlermeldung:


02:19:03,704 ERROR [http-bio-8080-exec-34][JDBCExceptionReporter:76] Unknown column 'mappingtest_SalesLine.salesheaderId' in 'on clause'


Scheinbar beachtet der Service-Builder das db-name-Attribut beim generieren der Tabellen, beim Abfragen der Relations-Einträge ignoriert er es allerdings. Dabei ist es übrigens egal, ob man im mapping-key-Attribut "salesheaderId" oder "othername" einträgt.

Müsste mal Jemand ein Issue für aufmachen.
thumbnail
Armin Cyrus Dahncke,修改在10 年前。

RE: Service Builder: mapping-key und db-name

Junior Member 帖子: 81 加入日期: 08-8-12 最近的帖子
Hi Dima,

vielleicht hilft dir der LPS weiter

https://issues.liferay.com/browse/LPS-32250