Spring Data JPA «многие ко многим» с дополнительным столбцом «Пользователь и роли» - PullRequest
0 голосов
/ 31 августа 2018

Я хочу использовать отношения «многие ко многим» с использованием пружинной загрузки JPA между User и Role сущностью.

Я смог добиться этого, используя код ниже, НО в моем требовании, мне нужно один дополнительный столбец в сводной таблице (users_to_role).

@ManyToMany
@JoinTable(
        name = "users_to_roles",
        joinColumns = @JoinColumn(
                name = "user_id", referencedColumnName = "id"),
        inverseJoinColumns = @JoinColumn(
                name = "role_id", referencedColumnName = "id"))
private List<Role> roles;

Вот мой новый код

User.java

@Entity
@Table(name = "users")
public class User {

   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private Long id;

   private String username;

   @OneToMany(mappedBy="users", cascade = CascadeType.ALL)
   private List<Role> roles;

   //getters and setters here
}

Role.java

@Entity
@Table(name = "roles")
public class Role {

   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private Long id;

   private String name;

   @OneToMany(mappedBy="roles", cascade = CascadeType.ALL)
   private List<User> users;

   //getters and setters here
}

UserRole.java

@Entity
@Table(name = "users_to_role")
public class UserRole {

   @Id
   @ManyToOne
   @JoinColumn(name = "user_id")
   private User user;

   @Id
   @ManyToOne
   @JoinColumn(name = "role_id")
   private Role role;

   private Date createdAt;

  //getters and setters here
}

Может ли кто-нибудь помочь мне указать, что я делаю неправильно?

Вот стек ошибок:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: Illegal use of mappedBy on both sides of the relationship: com.example.entities.Role.users

1 Ответ

0 голосов
/ 31 августа 2018

Это потому, что в вашей пользовательской сущности в @OneToMany вы указываете mappedBy как users, а в вашей UserRole сущности User сущность представлена ​​объектом user (не пользователями). Аналогично обстоит дело с Role Entity.

Просто синхронизируйте значение в атрибуте mappedBy с именами объектов, которые вы упоминаете в UserRole.

Во-вторых, в сущностях User и Role вы должны иметь List<UserRole> (не список пользователей или ролей), поскольку у вас будет внешний ключ в таблице users_to_role .

Следующее изменение будет работать

User.java

@OneToMany(mappedBy="user", cascade = CascadeType.ALL)
private List<UserRole> roles;

Role.java

@OneToMany(mappedBy="role", cascade = CascadeType.ALL)
private List<UserRole> users;

UserRole.java

public class UserRole implements Serializable {}
...