Hi there,
Is there a sample project using many-to-many link table with additional columns?
I need to implement this feature with editable table on Browse screen. If you can help with ideas would be great.
Thank you!
Hi there,
Is there a sample project using many-to-many link table with additional columns?
I need to implement this feature with editable table on Browse screen. If you can help with ideas would be great.
Thank you!
Click tutorial ![]()
Hello, does not really help in case there is many-to-many link table with additional fields.
Hi,
What is the problem, exactly?
I’ve created a small project to demonstrate the simplest example of a many-to-many link table with additional columns. If it’s not your case, please specify your question.
demo.zip (92.7 KB)
Also, you may be interested in this example, too: How do I display One-To-Many and Many-To-Many attribute by strategy? - CUBA.Platform
It contains quite an interesting example of many-to-many relationship.
Hi @shiryaeva!
Thank you for the answer. I cannot open the “demo” project: “Version of Platform used in project (6.9.0.BETA3) not supported.”
I am currently using 6.8.2. Please advise!
Regards!
Hi @shiryaeva!
I will give explanation to the problem I do face with “demo” example you provided.
What I need to do is to put in “Group Editor” screen a table with list of all Customers in this group. In this table “additional field” should be shown as well.
I should be able to add more Customers from this screen and edit their “additional field” from here.
I tried many times but still cannot find a solution. I would appreciate if you can help!
Thank you in advance!
Hi,
You can add an extra datasource to your Group editor and a Customers table bound to it, for example:
<collectionDatasource id="customerGroupsDs"
class="com.company.demo.entity.CustomerGroup"
view="customerGroup-view">
<query>
<![CDATA[select e from demo$CustomerGroup e
where e.group.id = :ds$groupDs]]>
</query>
</collectionDatasource>
<table id="customersTable"
width="100%">
<actions>
<action id="create"/>
<action id="edit"/>
<action id="remove"/>
</actions>
<columns>
<column id="additionalField"/>
<column id="customer.name"/>
</columns>
<rows datasource="customerGroupsDs"/>
<buttonsPanel id="buttonsPanel">
<button id="createButton"
action="customersTable.create"/>
<button id="editButton"
action="customersTable.edit"/>
<button id="removeButton"
action="customersTable.remove"/>
</buttonsPanel>
</table>
This will enable you to add new Customers through adding CustomerGroups.
Hi again,
There is a better solution for your use case:
Add composition attributes that will reference your link table and create a custom action that will enable to select a Customer and create a new link (CustomerGroup entity) in your Group editor.
Data model
@Table(name = "DEMO_CUSTOMER")
@Entity(name = "demo$Customer")
public class Customer extends StandardEntity {
@Composition
@OnDelete(DeletePolicy.CASCADE)
@OneToMany(mappedBy = "customer")
protected List<CustomerGroup> customerGroups;
}
@Table(name = "DEMO_GROUP")
@Entity(name = "demo$Group")
public class Group extends StandardEntity {
@Composition
@OnDelete(DeletePolicy.CASCADE)
@OneToMany(mappedBy = "group")
protected List<CustomerGroup> customerGroups;
}
@Table(name = "DEMO_CUSTOMER_GROUP")
@Entity(name = "demo$CustomerGroup")
public class CustomerGroup extends StandardEntity {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "CUSTOMER_ID")
protected Customer customer;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "GROUP_ID")
protected Group group;
@Column(name = "ADDITIONAL_FIELD")
protected String additionalField;
}
group-edit.xml:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<window xmlns="http://schemas.haulmont.com/cuba/window.xsd"
caption="msg://editorCaption"
class="com.company.demo.web.group.GroupEdit"
datasource="groupDs"
focusComponent="fieldGroup"
messagesPack="com.company.demo.web.group">
<dsContext>
<datasource id="groupDs"
class="com.company.demo.entity.Group"
view="group-view">
<collectionDatasource id="customerGroupsDs"
property="customerGroups">
</collectionDatasource>
</datasource>
</dsContext>
<dialogMode height="600"
width="800"/>
<layout expand="windowActions"
spacing="true">
<fieldGroup id="fieldGroup"
datasource="groupDs">
<column width="250px">
<field property="name"/>
</column>
</fieldGroup>
<groupBox id="customerGroupsBox"
caption="msg://com.company.demo.entity/Group.customerGroups">
<table id="customerGroupsTable"
height="200px"
width="100%" editable="true">
<actions>
<action id="addCustomer" invoke="addCustomer"/>
<action id="create"/>
<action id="edit"/>
<action id="remove"/>
</actions>
<columns>
<column id="customer"/>
<column id="additionalField" editable="true"/>
</columns>
<rows datasource="customerGroupsDs"/>
<buttonsPanel>
<button action="customerGroupsTable.addCustomer" caption="Add customer"/>
<button action="customerGroupsTable.create"/>
<button action="customerGroupsTable.edit"/>
<button action="customerGroupsTable.remove"/>
</buttonsPanel>
</table>
</groupBox>
<frame id="windowActions"
screen="editWindowActions"/>
</layout>
</window>
GroupEdit.java:
public class GroupEdit extends AbstractEditor<Group> {
@Inject
private Datasource<Group> groupDs;
@Inject
private CollectionDatasource<CustomerGroup, UUID> customerGroupsDs;
@Inject
private Metadata metadata;
public void addCustomer() {
openLookup(Customer.class, items -> {
if (!items.isEmpty()) {
Customer customer = (Customer) items.iterator().next();
CustomerGroup newLink = metadata.create(CustomerGroup.class);
newLink.setCustomer(customer);
newLink.setGroup(groupDs.getItem());
customerGroupsDs.addItem(newLink);
}
}, WindowManager.OpenType.DIALOG);
}
}
You can try this approach in the sample attached:
demo-with-composition.zip (93.5 KB)