Соотношение JPA / Hibernate ManyToMany с дополнительными полями - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть отображение многих связей, и я не могу заставить его работать.Я прочитал много постов и статей и не мог понять это.Если у кого-то есть идеи, пожалуйста, поделитесь.

Я постарался максимально упростить диаграмму и код.

Моя база данных разработана так: enter image description here

Мои сущности выглядят так (по крайней мере, последняя попытка, прежде чем спросить): Клиент:

@Entity
@Table(name = "client")
public class Client implements Serializable {
    @Id
    @Column(name = "client_id")
    private int id;

    ... other fields
}

Проект:

@Entity
@Table(name = "project")
public class Project implements Serializable {
    @EmbeddedId
    private ProjectId id;

    ... other fields

    @Embeddable
    class ProjectId implements Serializable {
        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "client_id", insertable = false, updatable = false)
        private Client client;

        @Column(name = "project_id")
        private int projectId;
    }
}

Пользователь:

@Entity
@Table(name = "user")
public class User implements Serializable {
    @EmbeddedId
    private UserId id;

    ... other fields

    @Embeddable
    class UserId implements Serializable {
        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "client_id", insertable = false, updatable = false)
        private Client client;

        @Column(name = "user_id")
        private int userId;
    }
}

ProjectUser:

@Entity
@Table(name = "project_user")
public class ProjectUser implements Serializable {
    @EmbeddedId
    private ProjectUserId id;

    ... other fields

    @Embeddable
    class ProjectUserId implements Serializable {
        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "client_id", insertable = false, updatable = false)
        private Client client;

        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumns({
            @JoinColumn(name = "client_id", referencedColumnName = "client_id", insertable = false, updatable = false),
            @JoinColumn(name = "project_id", referencedColumnName = "project_id", insertable = false, updatable = false) })
        private Project project;

        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumns({
            @JoinColumn(name = "client_id", referencedColumnName = "client_id", insertable = false, updatable = false),
            @JoinColumn(name = "user_id", referencedColumnName = "user_id", insertable = false, updatable = false) })
        private User user;
    }
}

Перед добавлением сущности ProjectUser все работает нормально.Теперь, когда я запускаю сервер, он говорит:

Повторяющийся столбец в сопоставлении для сущности: Столбец ProjectUser: client_id (должен отображаться с помощью insert = \ "false \" update = \ "false \") "}}

Итак, вопрос в том, как мне сделать эту работу?

РЕДАКТИРОВАТЬ: Java-приложение будет в основном REST-сервисами, предоставляющими данные. Проектирование базы данных такое, как есть. Оно имеет логический смысл и большая часть бизнес-логики будетв базе данных. У нас есть люди с очень хорошими знаниями БД, и не имеет смысла менять дизайн базы данных из-за ограничений JPA / Hibernate.

1 Ответ

0 голосов
/ 22 ноября 2018

Код ниже позволит hibernate создать структуру для ваших сущностей:

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "client_id", insertable = false, updatable = false)
    private Client client;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumns({
            @JoinColumn(name = "project_client_id", referencedColumnName = "client_id", insertable = false, updatable = false),
            @JoinColumn(name = "project_id", referencedColumnName = "project_id", insertable = false, updatable = false) })
    private Project project;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumns({
            @JoinColumn(name = "user_client_id", referencedColumnName = "client_id", insertable = false, updatable = false),
            @JoinColumn(name = "user_id", referencedColumnName = "user_id", insertable = false, updatable = false) })
    private User user;

Но чтобы создать схему, как показано на рисунке в вашем вопросе, избавьтесь от всех этих EmbeddedId.Используйте простые идентификаторы и добавьте проверку в свой код, если вы хотите, чтобы у проекта и пользователя в вашем ProjectUser был один и тот же client_id.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...