Ошибка "повторяющегося столбца в отображении для объекта" в спящем режиме - PullRequest
0 голосов
/ 10 марта 2020

У меня есть два класса, которые я хочу интегрировать через Hibernate:

  1. Класс цели , который содержит цели пользователя. Он поддерживается таблицей "DIC_GOAL".
  2. Роль класса , который содержит доступ пользователя. Он опирается на таблицу "ROLES"

В моей структуре базы данных у меня есть таблица "Цель" с полем "ROLE_ID" . Это поле указывает на таблицу ролей Первичный ключ "ID" . Итак, каждая строка (сущность) в таблице целей сопоставляется со строкой (сущностью) роли по одному.

Итак, я хочу присоединиться Класс роли к Класс цели чтобы иметь возможность представлять расширенное Rolename для каждой цели, которая помещается в класс роли . Я использую приведенный ниже код, чтобы сделать это в Hibernate (в классе цели):

   @OneToOne
   @JoinColumn (name="role_id")
   Role role;

И получаю ошибку: Повторный столбец в сопоставлении для сущности: com.platform.entity.Goal column: role_id ( должно быть сопоставлено с помощью insert = "false" update = "false") Пожалуйста, помогите мне исследовать эту ошибку?

Таблица ROLES

create table MAPP.ROLES
(
  id       INTEGER generated always as identity,
  rolename VARCHAR2(255),
  descr    VARCHAR2(255)
)

ЦЕЛЬ Таблица

create table MAPP.DIC_GOAL
(
  id      INTEGER generated always as identity,
  descr   NVARCHAR2(255),
  role_id INTEGER not null,
  vl      NUMBER
)

Класс цели

package com.platform.entity;

@Entity
@Table(name="dic_goal", schema="MAPP")
public class Goal {

   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   @Column(name = "ID", nullable = false)
   private Long id;

   @Column(name = "DESCR", length = 255, nullable = false)
   public String descr;

   @Column(name = "ROLE_ID", nullable = false)
   public int role_id;

   // Here it is!
   @OneToOne
   @JoinColumn (name="role_id")
   Role role;

   @Column(name = "VL")
   private float vl;

   public Long getId() {
       return id;
   }

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

   public String getDescr() {
       return descr;
   }

   public void setDescr(String descr) {
       this.descr= descr;
   }

   public float getVl() {
       return vl;
   }

   public void setVl(float vl) {
       this.vl = vl;
   }

    @Override
    public String toString() {
        return "ID=" + id + " DESCR=" + descr + " VL=" + vl;
    }

}

Класс роли

package com.platform.entity;

@Entity
@Table(name="roles", schema="MAPP")
public class Role implements GrantedAuthority {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID", nullable = false)
    private Long id;

    @Column(name = "ROLENAME", length = 255, nullable = false)
    @Size(min=5, message="Не меньше 5 знаков")
    private String roleName;

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name="user_roles", schema="MAPP",
            joinColumns = @JoinColumn(name="role_id"),
            inverseJoinColumns = @JoinColumn(name="user_id")
    )
    private Set<User> users;

    public String getName() {
        return roleName;
    }

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

    public Long getId() {
        return id;
    }

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


    @Override
    public String getAuthority() {
        return getName();
    }

    @Override
    public String toString() {
        return this.getName();
    }


}

1 Ответ

0 голосов
/ 11 марта 2020

Как правильно заметил Никос Параскевопулос: Причина проста: вы сопоставляете столбец role_id с двумя различными свойствами: роль Role и int role_id Поэтому я удалил int role_id и заменил это связанным объектом роли.

...