我在网上发现了类似的错误,但是答案中的建议要么没有太大帮助,要么我必须在 OneToMany 连接下重做所有事情,我不想这样做
完整的错误文本
org.springframework.beans.factory.BeanCreationException:创建 com.spring.config.DataConfig 中定义的名称为“entityManagerFactory”的 bean 时出错:调用 init 方法失败;嵌套异常是 org.hibernate.MappingException:外键 (FKbu6ivurs2s4v3x3yvbj632dwx:user_roles [role_id])) 必须具有与引用的主键相同的列数 (user_roles [user_id,role_id])
精华
用户.java
@Entity
@Table(name = "users")
public class User implements UserDetails {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "name", unique = true)
private String name;
@Column(name = "password")
private String password;
@Column(name = "email")
private String email;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "user_roles",
joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "role_id"))
private Set<UserRole> roleSet = new HashSet<>();
//getters, setters, constructors
角色.java
@Entity
@Table(name = "user_roles")
@Transient
public class UserRole implements GrantedAuthority {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "role", unique = true, nullable = false)
private String name;
@ManyToMany(mappedBy = "roleSet")
private Set<User> userSet = new HashSet<>();
//getters, setters, constructors
也许有人遇到过这样的问题?
所有其他类似乎都正确实现,但以防万一,一个指向 Git 存储库的链接
注意你的课:
然后你描述同一张桌子
在第一个选项中,您
user_roles使用字段id和进行了描述name,并且在您使用字段和User.java描述了此表。您完全可以理解地抛出以下错误:它根本不知道它指的是什么。user_idrole_idHibernate"Foreign key ... user_roles [role_id]..."role_id解决方案:您需要描述
Role.java的不是链接表user_roles(在注释中描述就足够了),而是表role。也就是说,@Table(name = "role")用角色替换表的名称或任何你的表更改用户实体中的代码
在
修复了这个错误(但现在还有很多其他的,嗯)