Generate Data Model code now fails on composite keys

I now get exceptions on code that was created by Generate Data Model that use composite keys

Exception [EclipseLink-46] (Eclipse Persistence Services - 2.7.9.5-jmix): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: There should be one non-read-only mapping defined for the primary key field [RuleStep.SEMI_RULESTEPCOMPKEY_“RULEENGINEID”].
Descriptor: RelationalDescriptor(tools.dataintegration.semioticmanager.entity.RuleStep → [DatabaseTable(RuleStep)])

Postgres table;
CREATE TABLE meta.“RuleStep”
(
“RuleEngineID” integer NOT NULL,
“RuleStep” integer NOT NULL,
“RuleID” integer,
“RuleType” character varying(20) COLLATE pg_catalog.“default”,
“NextStep” integer,
“OnError” integer,
“Options” text COLLATE pg_catalog.“default”,
CONSTRAINT “RuleStep_pkey” PRIMARY KEY (“RuleEngineID”, “RuleStep”),
CONSTRAINT “FKRuleStep143263” FOREIGN KEY (“RuleEngineID”)
REFERENCES meta.“RuleEngine” (“RuleEngineID”) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION,
CONSTRAINT “FKRuleStep360135” FOREIGN KEY (“RuleID”)
REFERENCES meta.“Rules” (“RuleID”) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION
)
/******************************************************************************************
package tools.dataintegration.semioticmanager.entity;

import io.jmix.core.metamodel.annotation.JmixEntity;
import io.jmix.core.metamodel.annotation.Store;
import io.jmix.data.DdlGeneration;
import tools.dataintegration.semioticmanager.entity.key.RuleStepCompKey;

import javax.persistence.*;

@DdlGeneration(value = DdlGeneration.DbScriptGenerationMode.DISABLED)
@JmixEntity
@Store(name = “etl”)
@Table(name = ““RuleStep””)
@Entity(name = “semi_RuleStep”)
public class RuleStep {
@EmbeddedId
@AttributeOverrides({
@AttributeOverride(name = “ruleEngineID”, column = @Column(name = “SEMI_RULESTEPCOMPKEY_“RULEENGINEID””)),
@AttributeOverride(name = “ruleStep”, column = @Column(name = “SEMI_RULESTEPCOMPKEY_“RULESTEP””))
})
private RuleStepCompKey id;

@Column(name = "\"NextStep\"")
private Integer nextStep;

@Column(name = "\"OnError\"")
private Integer onError;

@Column(name = "\"Options\"")
@Lob
private String options;

@JoinColumn(name = "\"RuleEngineID\"")
@MapsId
@ManyToOne(fetch = FetchType.LAZY)
private tools.dataintegration.semioticmanager.entity.RuleEngine ruleEngineID;

@JoinColumn(name = "\"RuleID\"")
@ManyToOne(fetch = FetchType.LAZY)
private Rule ruleID;

@Column(name = "\"RuleType\"", length = 20)
private String ruleType;

public String getRuleType() {
    return ruleType;
}

public void setRuleType(String ruleType) {
    this.ruleType = ruleType;
}

public Rule getRuleID() {
    return ruleID;
}

public void setRuleID(Rule ruleID) {
    this.ruleID = ruleID;
}

public tools.dataintegration.semioticmanager.entity.RuleEngine getRuleEngineID() {
    return ruleEngineID;
}

public void setRuleEngineID(tools.dataintegration.semioticmanager.entity.RuleEngine ruleEngineID) {
    this.ruleEngineID = ruleEngineID;
}

public String getOptions() {
    return options;
}

public void setOptions(String options) {
    this.options = options;
}

public Integer getOnError() {
    return onError;
}

public void setOnError(Integer onError) {
    this.onError = onError;
}

public Integer getNextStep() {
    return nextStep;
}

public void setNextStep(Integer nextStep) {
    this.nextStep = nextStep;
}

public RuleStepCompKey getId() {
    return id;
}

public void setId(RuleStepCompKey id) {
    this.id = id;
}

}
//****************************************************************************

package tools.dataintegration.semioticmanager.entity.key;

import io.jmix.core.metamodel.annotation.JmixEntity;
import org.springframework.data.util.ProxyUtils;

import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.persistence.Entity;
import java.util.Objects;

@JmixEntity(name = “semi_RuleStepCompKey”)
@Embeddable
public class RuleStepCompKey {
@Column(name = ““RuleEngineID””, nullable = false, unique = true)
private Integer ruleEngineID;

@Column(name = "\"RuleStep\"", nullable = false, unique = true)
private Integer ruleStep;

public Integer getRuleStep() {
    return ruleStep;
}

public void setRuleStep(Integer ruleStep) {
    this.ruleStep = ruleStep;
}

public Integer getRuleEngineID() {
    return ruleEngineID;
}

public void setRuleEngineID(Integer ruleEngineID) {
    this.ruleEngineID = ruleEngineID;
}

@Override
public int hashCode() {
    return Objects.hash(ruleEngineID, ruleStep);
}

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || ProxyUtils.getUserClass(this) != ProxyUtils.getUserClass(o)) return false;
    RuleStepCompKey entity = (RuleStepCompKey) o;
    return Objects.equals(this.ruleEngineID, entity.ruleEngineID) &&
            Objects.equals(this.ruleStep, entity.ruleStep);
}

}

Hi @fredzim1

Thank you for the feedback.
We created an issue about this case.

Regards,
Yulia

Hi @fredzim1

Quick fix should be available in Jmix studio v. 1.2.2
Full fix we expect in Jmix studio v. 1.3