foreignKey или inverseForeignKey для таблицы «многие ко многим»

0

У меня есть проект Spring, который использует JPA с Hibernate и MySQL и базу данных с тремя таблицами: "Пользователи", "Роли" и "Соединения". Не могли бы вы рассказать мне, следует ли мне использовать атрибут inverseForeignKey в inverseJoinColumn или хранить его как есть (просто foreignKey)?

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

    // Class contains some other variables and methods that are irrelevant to this question

    // All annotations are from javax.persistence package
    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "user_roles", 
        joinColumns = @JoinColumn(name = "user_id", foreignKey = @ForeignKey(name = "FK_users_user_roles_user_id")), 
        inverseJoinColumns = @JoinColumn(name = "role_id", foreignKey = @ForeignKey(name = "FK_roles_user_roles_role_id")))
    private Set<Role> roles;

    }

SQL-скрипты для всех таблиц:

CREATE TABLE 'users' (
  'user_id' int(11) NOT NULL AUTO_INCREMENT,
  'email' varchar(255) NOT NULL,
  'username' varchar(255) NOT NULL,
  'password' varchar(255) NOT NULL,
  'points' bigint(11) NOT NULL,
  'rank' varchar(255) DEFAULT NULL,
  'registered_at' date DEFAULT NULL,
  'avatar' varchar(255) DEFAULT NULL,
  'full_name' varchar(255) DEFAULT NULL,
  'info' varchar(255) DEFAULT NULL,
  PRIMARY KEY ('user_id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE 'roles' (
  'role_id' int(11) NOT NULL AUTO_INCREMENT,
  'role' varchar(255) DEFAULT NULL,
  PRIMARY KEY ('role_id')
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE 'user_roles' (
  'user_id' int(11) NOT NULL,
  'role_id' int(11) NOT NULL,
  PRIMARY KEY ('user_id','role_id'),
  CONSTRAINT 'FK_roles_user_roles_role_id' FOREIGN KEY ('role_id') REFERENCES 'roles' ('role_id') ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT 'FK_users_user_roles_user_id' FOREIGN KEY ('user_id') REFERENCES 'users' ('user_id') ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Теги:
spring
many-to-many
jpa

1 ответ

1
Лучший ответ

Вы можете просто использовать referencedColumnName для ссылки на первичный ключ родительских таблиц в таблице соединений. Отображение @ManyToMany может выглядеть следующим образом.

@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "user_roles", 
    joinColumns = @JoinColumn(name = "user_id", referencedColumnName="user_id"), 
    inverseJoinColumns = @JoinColumn(name = "role_id", referencedColumnName="role_id"))
private Set<Role> roles;

См. Здесь

  • 0
    Разве это не заставит Hibernate создавать новые внешние ключи (со случайными именами) вместо использования тех, которые были применены в моем коде?
  • 1
    Нет, не будет Вы просто даете hibernate знать внешние ключи, на которые он должен ссылаться.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню