簡體   English   中英

多對多聯接表的foreignKey或inverseForeignKey

[英]foreignKey or inverseForeignKey for many-to-many join table

我有一個Spring項目,該項目將JPA與Hibernate和MySQL一起使用,並且該數據庫具有三個表:Users,Role和join表User Roles。 您能否告訴我是應該在inverseJoinColumn中使用inverseForeignKey屬性還是將其保持不變(簡單地為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;

您可以簡單地使用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;

請參考這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM