Модель данных при использовании её разными приложениями

Есть задача - разработать модель данных для совместного использования разными приложениями Jmix.
Каким образом реализуются такого рода задачи?
Можно ли DataModel сделать общим для разных проектов приложений?

Создайте аддон и разрабатывайте общую модель в нем.
Приложения или другие аддоны смогут использовать и расширять общую модель.

С уважением,
Константин

1 симпатия

Возможно ли где-то пример посмотреть?

Какого рода пример вы бы хотели увидеть?

Вы можете за полчаса набросать такой проект:

  • Создайте новый композитный проект
  • Создайте подпроект-аддон A (New → Subproject), в нем сущность Customer
  • Создайте подпроект-приложение B. Настройте зависимость B от A (Settings → Dependencies Between Subprojects)
  • В проекте B создавайте экраны для Customer и/или сущности, ссылающиеся на Customer.
  • Создайте подпроект-приложение C. Настройте зависимость B от A. И так далее.

Спасибо, попробую.

Подскажите, как при такой архитектуре настроить беопастность? Таблица пользователей генерируется в FullStack-проекте только. (Я учусь только, прошу с пониманием отнестить)

По сути, вам пользователи не нужны для прорисовки безопасности. Посмотрите как описываются те же Ресурсные роли.

Например, базовые роли для Отчетов и прочих аддонов Jmix определяются в самом аддоне.

Где-то в подпроекте, где вы реализуете конкретный блок бизнес-логики работы с конкретными сущностями и их экранами, наверное где-то там логично и рисовать все роли для этого блока.

Там у вас для этого есть и экраны и сущности.

А в “конечном” приложении у вас создаются пользователи с их репозиторием и там вы используете эти роли.

Обновил пример с централизованным (в аддоне) управлением пользователями:
jmix-projects/sample-composite-project-2

С уважением,
Константин

1 симпатия

Попробовал создать составной проект,
Создал составной проект, в котором описана модель данных users, добавил модуль, в котором описан person со ссылкой на users.
но столкнулся с следующим:



> Task :persons:persons:compileJava FAILED

Execution failed for task ':persons:persons:compileJava'.
> javassist.NotFoundException: io.jmix.security.authentication.JmixUserDetails

эту же проблему описывали на англоязычном форуме

вот код entity:

@JmixEntity
@Table(name = "PERS_PERSON", indexes = {
        @Index(name = "IDX_PERSON_USER", columnList = "USER_ID")
})
@Entity(name = "pers_Person")
public class Person extends BaseEntity {
    @JoinColumn(name = "USER_ID")
    @ManyToOne(fetch = FetchType.LAZY)
    private User user;

    @Column(name = "BIO_ID")
    private Integer bio_id;

    @Column(name = "SEX", length = 5)
    private String sex;

    @Column(name = "BIRTHDAY")
    private LocalDate birthday;

    @Column(name = "FIRST_NAME", nullable = false)
    @NotNull
    private String firstName;

    @Column(name = "LAST_NAME", nullable = false)
    @NotNull
    private String lastName;

    @Column(name = "MIDDLE_NAME")
    private String middleName;

    @Column(name = "PHOTO")
    private byte[] photo;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "TYPE_PERSON_ID")
    private TypePerson typePerson;


    public Integer getBio_id() {
        return bio_id;
    }

    public void setBio_id(Integer bio_id) {
        this.bio_id = bio_id;
    }

    public Sex getSex() {
        return sex == null ? null : Sex.fromId(sex);
    }

    public void setSex(Sex sex) {
        this.sex = sex == null ? null : sex.getId();
    }

    public TypePerson getTypePerson() {
        return typePerson;
    }

    public void setTypePerson(TypePerson typePerson) {
        this.typePerson = typePerson;
    }

    public byte[] getPhoto() {
        return photo;
    }

    public void setPhoto(byte[] photo) {
        this.photo = photo;
    }

    public LocalDate getBirthday() {
        return birthday;
    }

    public void setBirthday(LocalDate birthday) {
        this.birthday = birthday;
    }

    public String getMiddleName() {
        return middleName;
    }

    public void setMiddleName(String middleName) {
        this.middleName = middleName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

upd. Оказалось, что в модуле persons нужно наличие Main Data Store, c changelog:

<include file="/io/jmix/data/liquibase/changelog.xml" contextFilter="@jmix-addon"/>
<include file="/com/company/users/liquibase/changelog.xml" contextFilter="@jmix-addon"/>

(Изучил пример из поста выше) так же в persons.gradle нужно было установить зависимость:
implementation ‘io.jmix.security:jmix-security-starter’
implementation ‘io.jmix.security:jmix-security-flowui-starter’
implementation ‘io.jmix.security:jmix-security-data-starter’

1 симпатия