2017-04-25 185 views
1

我正在使用JPA + Hibernate + SpringBoot + PostgreSQL,以創建不同實體之間的關係,但我收到大量錯誤,包括看起來像SQL錯誤,但應用程序反正開始了。我是否正確編碼manyToMany關係?可能有很多用戶,每個用戶可以有多個角色。也許OneToMany比較好?JPA用戶,角色,manyToMany休眠關係

我使用「彈簧引導起動數據JPA」

這是唯一的休眠文件,我有這麼遠。

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; 
    } 
} 

而且錯誤,我得到:

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 
+0

'用戶'是關鍵詞。你不能使用這個名字作爲你的表名。 – soorapadman

+0

使用反引號來轉義表名。 –

回答

2

,首先你應該放下你的數據庫或改變你的休眠配置創建

<prop key="hibernate.hbm2ddl.auto">create</prop> 

,誤差

ERROR: relation "user_roles" does not exist 

所以你應該命名爲多對多的user_roles

@JoinTable(name="user_roles", 
     joinColumns = {@JoinColumn(name="user_id", referencedColumnName="id")}, 
     inverseJoinColumns = {@JoinColumn(name="role_id", referencedColumnName="id")} 
    ) 
    private List<Role> roles; 
在我的項目用戶實體

是:

@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(); 
    } 
} 

和角色:

@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; 
    } 

} 
+0

你怎麼沒有在你的文件中的Id文件?你也沒有實現序列化,但你擴展AbstractPersistable ? – Dexter

+0

自動生成的Id從AbstractPersistable擴展而來,並且AbstractPersistable實現了Serializable –

+0

當我嘗試添加一個現有角色和一個不存在的角色時,仍然存在添加角色時出現分離實體持久性問題的一些問題。但也許我應該改變這OneToMany – Dexter