Наследование классов сущностей


(Евгения) #1

Добрый день
У меня есть две сущности, созданные из таблиц, у которых свой первичный ключ. Одна из сущностей является родительской к другой. У каждой сущности создался атрибут “ID”.
При инициализации задаю значения двум ID. Но когда происходит инсерт, получается что я задаю значение первичному ключу только родительской сущности.

@PostConstruct
protected void init() {
     setId(AppBeans.get(UniqueNumbersService.class).getNextNumber("cm_vagonlist_extnd_seq"));

     super.setId(AppBeans.get(UniqueNumbersService.class).getNextNumber("cm_documents_seq"));
 }

Как сделать так, чтобы при создании нового экземпляра сущности инициализировались оба значения для первичных ключей?
scheme_sample


(Konstantin Krivopustov) #2

Добрый день!
Приведите пожалуйста код классов сущностей (только заголовки классов и атрибуты связей).


(Евгения) #3

Добрый день!

package com.company.inputvagonlist.entity;

import javax.annotation.PostConstruct;
import javax.inject.Inject;
import javax.persistence.*;

import com.haulmont.cuba.core.app.UniqueNumbersService;
import com.haulmont.cuba.core.global.AppBeans;
import com.haulmont.cuba.core.global.DesignSupport;
import com.haulmont.cuba.core.entity.BaseLongIdEntity;

@DiscriminatorValue("16")

@PrimaryKeyJoinColumn(name = "document_id", referencedColumnName = "document_id")
@Table(name = "CM_VAGONLIST_EXTND")
@DesignSupport("{'imported':true,'unmappedColumns':['vagonlist_type_id']}")
@AttributeOverrides({
        @AttributeOverride(name = "id", column = @Column(name = "vagonlist_extnd_id"))
})
@Entity(name = "inputvagonlist$CmVagonlistExtnd")
public class CmVagonlistExtnd extends CmDocuments {
    private static final long serialVersionUID = -7339815046069951040L;

    public Long getVagonlistExtndId() {
        return vagonlistExtndId;
    }

    public void setVagonlistExtndId(Long vagonlistExtndId) {
        this.vagonlistExtndId = vagonlistExtndId;
    }

    @Column(name = "vagonlist_extnd_id", nullable = false)
    protected Long vagonlistExtndId;

    @Column(name = "vagonlist_type_id")
    protected Long vagonlistType;

    @Column(name = "pouring_no", length = 10)
    protected String pouringNo;

    @Column(name = "station_id")
    protected Integer station;

    @Column(name = "depl_person_id")
    protected Integer deplPerson;

    public void setVagonlistType(Long vagonlistType) {
        this.vagonlistType = vagonlistType;
    }

    public Long getVagonlistType() {
        return vagonlistType;
    }

    @PostConstruct
    protected void init() {
        super.init();
        setVagonlistExtndId(AppBeans.get(UniqueNumbersService.class).getNextNumber("cm_vagonlist_extnd_seq"));
    }

    public void setPouringNo(String pouringNo) {
        this.pouringNo = pouringNo;
    }

    public String getPouringNo() {
        return pouringNo;
    }

    public void setStation(Integer station) {
        this.station = station;
    }

    public Integer getStation() {
        return station;
    }

    public void setDeplPerson(Integer deplPerson) {
        this.deplPerson = deplPerson;
    }

    public Integer getDeplPerson() {
        return deplPerson;
    }


}
package com.company.inputvagonlist.entity;

import javax.annotation.PostConstruct;
import javax.persistence.Entity;
import javax.persistence.Table;
import com.haulmont.chile.core.annotations.NamePattern;
import javax.persistence.AttributeOverrides;
import javax.persistence.AttributeOverride;
import javax.persistence.Column;

import com.haulmont.cuba.core.app.UniqueNumbersService;
import com.haulmont.cuba.core.global.AppBeans;
import com.haulmont.cuba.core.global.DesignSupport;
import java.util.Date;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import com.haulmont.cuba.core.entity.BaseLongIdEntity;
import javax.validation.constraints.NotNull;
import javax.persistence.InheritanceType;
import javax.persistence.DiscriminatorType;
import javax.persistence.Inheritance;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorValue;

@DiscriminatorValue("16")
@DiscriminatorColumn(name = "document_type_id", discriminatorType = DiscriminatorType.INTEGER)
@Inheritance(strategy = InheritanceType.JOINED)
@DesignSupport("{'imported':true}")
@AttributeOverrides({
        @AttributeOverride(name = "id", column = @Column(name = "document_id"))
})
@NamePattern("%s|name")
@Table(name = "cm_documents")
@Entity(name = "inputvagonlist$CmDocuments")
public class CmDocuments extends BaseLongIdEntity {
    private static final long serialVersionUID = 7747107153467373663L;

    @Column(name = "parent_id")
    protected Long parent;

    @Column(name = "document_type_id", nullable = false)
    protected Long documentType;

    @Column(name = "reg_no", length = 128)
    protected String regNo;

    @Temporal(TemporalType.DATE)
    @Column(name = "reg_date", nullable = false)
    protected Date regDate;

    @Column(name = "name")
    protected String name;

    @Column(name = "agent_id")
    protected Long agent;

    @Column(name = "contragent_id")
    protected Long contragent;

    @Temporal(TemporalType.DATE)
    @Column(name = "start_date")
    protected Date startDate;

    @Temporal(TemporalType.DATE)
    @Column(name = "finish_date")
    protected Date finishDate;

    @Column(name = "state_id")
    protected Integer stateId;

    @Column(name = "state", length = 1)
    protected String state;

    @Column(name = "descript")
    protected String descript;

    @Column(name = "user_change", length = 128)
    protected String userChange;

    @Temporal(TemporalType.DATE)
    @Column(name = "date_change")
    protected Date dateChange;

    @Temporal(TemporalType.DATE)
    @Column(name = "date_create")
    protected Date dateCreate;

    @Column(name = "user_create", length = 60)
    protected String userCreate;

    @NotNull
    @Column(name = "object_id", nullable = false)
    protected Long object;

    public void setState(String state) {
        this.state = state;
    }

    public String getState() {
        return state;
    }


    public void setStateId(Integer stateId) {
        this.stateId = stateId;
    }

    public Integer getStateId() {
        return stateId;
    }

    public void setParent(Long parent) {
        this.parent = parent;
    }

    public Long getParent() {
        return parent;
    }

    public void setDocumentType(Long documentType) {
        this.documentType = documentType;
    }

    public Long getDocumentType() {
        return documentType;
    }

    public void setRegNo(String regNo) {
        this.regNo = regNo;
    }

    public String getRegNo() {
        return regNo;
    }

    public void setRegDate(Date regDate) {
        this.regDate = regDate;
    }

    public Date getRegDate() {
        return regDate;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setAgent(Long agent) {
        this.agent = agent;
    }

    public Long getAgent() {
        return agent;
    }

    public void setContragent(Long contragent) {
        this.contragent = contragent;
    }

    public Long getContragent() {
        return contragent;
    }

    public void setStartDate(Date startDate) {
        this.startDate = startDate;
    }

    public Date getStartDate() {
        return startDate;
    }

    public void setFinishDate(Date finishDate) {
        this.finishDate = finishDate;
    }

    public Date getFinishDate() {
        return finishDate;
    }

    public void setDescript(String descript) {
        this.descript = descript;
    }

    public String getDescript() {
        return descript;
    }

    public void setUserChange(String userChange) {
        this.userChange = userChange;
    }

    public String getUserChange() {
        return userChange;
    }

    public void setDateChange(Date dateChange) {
        this.dateChange = dateChange;
    }

    public Date getDateChange() {
        return dateChange;
    }

    public void setDateCreate(Date dateCreate) {
        this.dateCreate = dateCreate;
    }

    public Date getDateCreate() {
        return dateCreate;
    }

    public void setUserCreate(String userCreate) {
        this.userCreate = userCreate;
    }

    public String getUserCreate() {
        return userCreate;
    }

    public void setObject(Long object) {
        this.object = object;
    }

    public Long getObject() {
        return object;
    }

    @PostConstruct
    protected void init() {
        setId(AppBeans.get(UniqueNumbersService.class).getNextNumber("cm_documents_seq"));
        setObject(AppBeans.get(UniqueNumbersService.class).getNextNumber("cm_object_id_seq"));
        setDocumentType(Long.valueOf(16));
    }
}

что б исправить ошибку я добавила, в класс наследник:

public Long getVagonlistExtndId() {
        return vagonlistExtndId;
    }

    public void setVagonlistExtndId(Long vagonlistExtndId) {
        this.vagonlistExtndId = vagonlistExtndId;
    }

    @Column(name = "vagonlist_extnd_id", nullable = false)
    protected Long vagonlistExtndId;

но наверно это можно сделать по другому?


(Konstantin Krivopustov) #4

А для чего вам дополнительный первичный ключ на расширенной таблице? Мне кажется можно обойтись без него, чтобы document_id был и PK и FK:

@DiscriminatorValue("16")
@PrimaryKeyJoinColumn(name = "document_id", referencedColumnName = "document_id")
@Table(name = "CM_VAGONLIST_EXTND")
@AttributeOverrides({
        @AttributeOverride(name = "id", column = @Column(name = "document_id"))
})
@Entity(name = "inputvagonlist$CmVagonlistExtnd")
public class CmVagonlistExtnd extends CmDocuments {

(Евгения) #5

изначально была база с такой архитектурой