JPA User, Role, manyToMany hibernate relationship
17,500
First of all you should drop your database or change your hibernate config to create
<prop key="hibernate.hbm2ddl.auto">create</prop>
and the error is
ERROR: relation "user_roles" does not exist
so you should name the ManyToMany as user_roles:
@JoinTable(name="user_roles",
joinColumns = {@JoinColumn(name="user_id", referencedColumnName="id")},
inverseJoinColumns = {@JoinColumn(name="role_id", referencedColumnName="id")}
)
private List<Role> roles;
in My project User Entity is :
@Entity
@Table(name = "user")
public class User extends AbstractPersistable<Long>{
private static final long serialVersionUID = 1L;
@Column(name = "USER_NAME", unique = true)
private String username;
@Column(name = "PASSWORD")
private String password;
@ManyToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)
@JoinTable(name="user_roles",
joinColumns = {@JoinColumn(name="user_id", referencedColumnName="id")},
inverseJoinColumns = {@JoinColumn(name="role_id", referencedColumnName="id")}
)
private List<Role> roles;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public List<Role> getRoles() {
return roles;
}
public void setRoles(List<Role> roles) {
this.roles = roles;
}
public User(String username, String password, List<Role> roles) {
super();
this.username = username;
this.password = password;
this.roles = roles;
}
public User() {
super();
}
}
and Roles :
@Entity
@Table(name = "roles")
public class Role extends AbstractPersistable<Long> {
private static final long serialVersionUID = 1L;
private String role;
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
public Role() {
}
public Role(String role) {
this.role = role;
}
}
Author by
Dexter
Updated on July 20, 2022Comments
-
Dexter almost 2 years
I'm using JPA+Hibernate+SpringBoot+PostgreSQL, to create a relationship between different entities, but I am getting a ton of errors, including what looks like SQL errors, but the application started up anyway. Did I code the manyToMany relation correctly? There could be many users, and each user can have multiple roles. Maybe OneToMany is better?
I'm using "spring-boot-starter-data-jpa"
These are the only hibernate files I have so far.
Role.java
@Entity(name = "role") public class Role implements java.io.Serializable { /** * */ private static final long serialVersionUID = -5525359165179861924L; @Id @GeneratedValue(strategy=GenerationType.AUTO) @Column(name = "id") int id; private String role; @ManyToMany(mappedBy = "roles",fetch = FetchType.LAZY) private Set<User> users; public Role(String role) { super(); this.role = role; } public void setId(int id){ this.id = id; } public int getId(){ return id; } public String getRole() { return role; } public void setRole(String role) { this.role = role; } public Set<User> getUsers() { return users; } public void setUser(Set<User> users) { this.users = users; } }
User.java
@Entity @Table(name = "user") public class User implements java.io.Serializable { private static final long serialVersionUID = 4910225916550731448L; @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "id", unique = true, nullable = false) private Long id; @Column(name = "created") Date created; @Column(name = "firstName", length = 100) private String firstName; @Column(name = "lastName", length = 100) private String lastName; @Column(name = "email", length = 150) private String email; @Column(name = "username", length = 150) private String username; @Column(name = "enabled") private int enabled; @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) @JoinTable(joinColumns = @JoinColumn(name = "userId", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "roleId", referencedColumnName = "id")) private Set<Role> roles; protected User(){ roles = new HashSet<Role>(); } public Set<Role> getRoles(){ return roles; } public void setRoles(Set<Role> roles){ this.roles = roles; } public User(String firstName, String lastName, String email, String username, Set<Role> roles) { this.firstName = firstName; this.lastName = lastName; this.email = email; this.username = username; this.roles = roles; } }
And the errors I get:
2017-04-24 22:49:19.163 WARN 20488 --- [ restartedMain] org.hibernate.orm.deprecation : HHH90000014: Found use of deprecated [org.hibernate.id.SequenceGenerator] sequence-based id generator; use org.hibernate.id.enhanced.SequenceStyleGenerator instead. See Hibernate Domain Model Mapping Guide for details. 2017-04-24 22:49:19.167 WARN 20488 --- [ restartedMain] org.hibernate.orm.deprecation : HHH90000014: Found use of deprecated [org.hibernate.id.SequenceGenerator] sequence-based id generator; use org.hibernate.id.enhanced.SequenceStyleGenerator instead. See Hibernate Domain Model Mapping Guide for details. 2017-04-24 22:49:19.438 INFO 20488 --- [ restartedMain] org.hibernate.tuple.PojoInstantiator : HHH000182: No default (no-argument) constructor for class: com.example.domain.Role (class must be instantiated by Interceptor) 2017-04-24 22:49:19.527 INFO 20488 --- [ restartedMain] org.hibernate.tool.hbm2ddl.SchemaExport : HHH000227: Running hbm2ddl schema export Hibernate: alter table user_roles drop constraint FKrhfovtciq1l558cw6udg0h0d3 2017-04-24 22:49:19.531 ERROR 20488 --- [ restartedMain] org.hibernate.tool.hbm2ddl.SchemaExport : HHH000389: Unsuccessful: alter table user_roles drop constraint FKrhfovtciq1l558cw6udg0h0d3 2017-04-24 22:49:19.531 ERROR 20488 --- [ restartedMain] org.hibernate.tool.hbm2ddl.SchemaExport : ERROR: relation "user_roles" does not exist Hibernate: alter table user_roles drop constraint FK55itppkw3i07do3h7qoclqd4k 2017-04-24 22:49:19.532 ERROR 20488 --- [ restartedMain] org.hibernate.tool.hbm2ddl.SchemaExport : HHH000389: Unsuccessful: alter table user_roles drop constraint FK55itppkw3i07do3h7qoclqd4k 2017-04-24 22:49:19.533 ERROR 20488 --- [ restartedMain] org.hibernate.tool.hbm2ddl.SchemaExport : ERROR: relation "user_roles" does not exist Hibernate: drop table if exists role cascade Hibernate: drop table if exists user cascade 2017-04-24 22:49:19.535 ERROR 20488 --- [ restartedMain] org.hibernate.tool.hbm2ddl.SchemaExport : HHH000389: Unsuccessful: drop table if exists user cascade 2017-04-24 22:49:19.535 ERROR 20488 --- [ restartedMain] org.hibernate.tool.hbm2ddl.SchemaExport : ERROR: syntax error at or near "user" Position: 22 Hibernate: drop table if exists user_roles cascade Hibernate: drop sequence hibernate_sequence 2017-04-24 22:49:19.537 ERROR 20488 --- [ restartedMain] org.hibernate.tool.hbm2ddl.SchemaExport : HHH000389: Unsuccessful: drop sequence hibernate_sequence 2017-04-24 22:49:19.538 ERROR 20488 --- [ restartedMain] org.hibernate.tool.hbm2ddl.SchemaExport : ERROR: sequence "hibernate_sequence" does not exist Hibernate: create sequence hibernate_sequence start 1 increment 1 Hibernate: create table role (id int4 not null, role varchar(255), primary key (id)) Hibernate: create table user (id int8 not null, created timestamp, email varchar(150), enabled int4, first_name varchar(100), last_name varchar(100), username varchar(150), primary key (id)) 2017-04-24 22:49:19.564 ERROR 20488 --- [ restartedMain] org.hibernate.tool.hbm2ddl.SchemaExport : HHH000389: Unsuccessful: create table user (id int8 not null, created timestamp, email varchar(150), enabled int4, first_name varchar(100), last_name varchar(100), username varchar(150), primary key (id)) 2017-04-24 22:49:19.564 ERROR 20488 --- [ restartedMain] org.hibernate.tool.hbm2ddl.SchemaExport : ERROR: syntax error at or near "user" Position: 14 Hibernate: create table user_roles (user_id int8 not null, role_id int4 not null, primary key (user_id, role_id)) Hibernate: alter table user_roles add constraint FKrhfovtciq1l558cw6udg0h0d3 foreign key (role_id) references role Hibernate: alter table user_roles add constraint FK55itppkw3i07do3h7qoclqd4k foreign key (user_id) references user 2017-04-24 22:49:19.585 ERROR 20488 --- [ restartedMain] org.hibernate.tool.hbm2ddl.SchemaExport : HHH000389: Unsuccessful: alter table user_roles add constraint FK55itppkw3i07do3h7qoclqd4k foreign key (user_id) references user 2017-04-24 22:49:19.585 ERROR 20488 --- [ restartedMain] org.hibernate.tool.hbm2ddl.SchemaExport : ERROR: syntax error at or near "user" Position: 100 2017-04-24 22:49:19.585 INFO 20488 --- [ restartedMain] org.hibernate.tool.hbm2ddl.SchemaExport : HHH000230: Schema export complete