2016-10-31 2 views
0

Meine Benutzertabelle istone to many Hibernate Problem

@Entity 
@Table(name = "PERSON") 
public class User implements Serializable { 
    private static final long serialVersionUID = 1L;  
    @Id 
    @Column(name = "ID") 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private int id; 
    @Column(name = "NAME") 
    private String name; 
    @Column(name = "USER_ID") 
    private String userId; 
    @Column(name = "PASSWORD") 
    private String password; 
    @Column(name = "EMAIL") 
    private String email; 
    @Column(name = "ROLE") 
    private String role; 
    @Column(name = "DEPARTMENT") 
    private String department; 

    private Roles roles; 

    public User() { 
    } 

    public int getId() { 
     return id; 
    } 
    public void setId(int id) { 
     this.id = id; 
    } 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public String getEmail() { 
     return email; 
    } 
    public void setEmail(String email) { 
     this.email = email; 
    } 
    public String getDepartment() { 
     return department; 
    } 
    public void setDepartment(String department) { 
     this.department = department; 
    } 
    public String getUserId() { 
     return userId; 
    } 
    public void setUserId(String userId) { 
     this.userId = userId; 
    } 
    public String getPassword() { 
     return password; 
    } 
    public void setPassword(String password) { 
     this.password = password; 
    }  

    public String getRole() { 
     return role; 
    } 

    public void setRole(String role) { 
     this.role = role; 
    } 


    @JoinColumn(name = "RID") 
    public Roles getRoles() { 
     return roles; 
    } 

    public void setRoles(Roles roles) { 
     this.roles = roles; 
    } 
} 

Und meine Rolle Klasse ist

@Entity 
@Table(name = "ROLES") 
public class Roles implements Serializable { 

    private static final long serialVersionUID = 1L; 

    private int rid; 
    private String role; 
    private String description; 

    // list of child class members 
    private List<User> user; 

    // map the child class[User] with java.util.Collection. Here we r using SET 
    // private Set<User> users; 

    // no arg constructor 
    public Roles() { 
    } 
    @Id 
    @Column(name = "RID") 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    public int getRid() { 
     return rid; 
    } 
    public void setRid(int rid) { 
     this.rid = rid; 
    } 

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
    public List<User> getUser() { 
     return user; 
    } 
    public void setUser(List<User> user) { 
     this.user = user; 
    } 

    @Column(name = "role") 
    public String getRole() { 
     return role; 
    } 

    public void setRole(String role) { 
     this.role = role; 
    } 

    @Column(name = "Description") 
    public String getDescription() { 
     return description; 
    } 

    public void setDescription(String description) { 
     this.description = description; 
    } 

} 

von diesem admin.jsp auf die Benutzer klicken die Steuerung zu/Benutzer

Maping geht
<body> 
    <h1>Admin Page</h1> 
    You can do the followings: 

    <form:form action="/users" method="post" ModelAttribute="user" > 

     <table border="1" > 
      <tr> 
       <td><a href="findUserById"> Find a User</a></td> 
      </tr> 

      <tr> 
       <td><a href="users">Edit a User</a></td> 
      </tr> 

      <tr> 
       <td><a href="users">Update a User</a></td> 
      </tr> 

      <tr> 
       <td><a href="users"> Delete a User</a></td> 
      </tr> 

      <tr> 
       <td><a href="users">List of all the Users</a></td> 
      </tr> 

     </table> 
    </form:form> 

</body> 

Controller Mapping ist:

@RequestMapping(value = "/users", method = RequestMethod.GET) 
    public String usersList(@ModelAttribute("user") User user, BindingResult result, Model model) {  
     List<User> userList = userService.listPersons();   
     // attribute goes to jsp 
     model.addAttribute("userList", userList);  
     // return jsp page 
     return "users"; 
    } 

users.jsp ist

<body> 
<h2>List of Users</h2> 
<form:form modelAttribute="user" method="GET" > 
    <table> 
     <thead style="background: #fcf"> 
      <tr> 
       <th>ID</th> 
       <th>Name</th> 
       <th>User Id</th> 
       <th>Password</th> 
       <th>Email</th> 
       <th>Department</th> 
       <th>Role</th> 
       <th>Update</th> 
       <th>Delete</th> 

      </tr> 
     </thead> 
     <c:forEach items="${userList}" var="user"> 
      <tr> 
       <td>${user.id}</td> 
       <td>${user.name}</td> 
       <td>${user.userId}</td> 
       <td>${user.password}</td> 
       <td>${user.email}</td> 
       <td>${user.department}</td> 
       <td>${user.role}</td> 

       <td><a href="<c:url value='/user/edit/${user.id}' />">Edit</a></td> 
       <td><a href="<c:url value='/delete/${user.id}' />">Delete</a></td> 
      </tr> 
</c:forEach> 
</table> 
</form:form> 
</body> 

Ich versuche, eine zu viele Assoziation mit Hibernate zu haben. Ein Rollen kann vielen Benutzern zugewiesen werden, sodass Rollen die übergeordnete Entität und Benutzer die untergeordnete Entität ist. Ich habe zwei Tabellen Benutzer und Rollen ... wenn ich die app laufen bekomme ich diese

INFO: Server startup in 8273 ms 
WARN : org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL Error: 1054, SQLState: 42S22 
ERROR: org.hibernate.engine.jdbc.spi.SqlExceptionHelper - Unknown column 'user0_.roles' in 'field list' 

Andere Teile ok der App ausgeführt werden. Wie soll ich darüber gehen? was ich falsch mache. Bitte helfen Sie.

Antwort

0

@ManyToOne zur User Klasse hinzufügen:

@ManyToOne 
private Roles roles; 

mappedBy in Roles Klasse hinzufügen:

@OneToMany(mappedBy = "roles",fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
public List<User> getUser() { 
+0

bekomme ich diese: ERROR: org.hibernate.engine.jdbc.spi.SqlExceptionHelper - Unknown column 'user0_.roles_RID' in 'field list' – javaz

+0

Höchstwahrscheinlich mit dieser Linie zu tun @Column (Name = "RID"). Überprüfen Sie, dass Sie den richtigen Spaltennamen gemäß Tabelle Struktur – Aeseir

+0

haben Ich denke, es ist etwas mit Primärschlüssel und Fremdschlüssel zu tun ... aber ich weiß nicht, was zu tun ist oder wie zu tun? – javaz

0

In Ihrer Benutzerklasse:

@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.DETACH) 
@JoinColumn(name = "RID") 
List<Rol> roles; 

Und in Ihrer Rol Klasse:

@OneToMany(mappedBy="roles", fetch = FetchType.LAZY) 
@JsonIgnore 
private List<User> users; 

Dies sollte funktionieren

+0

Muss ich eine Zwischentabelle erstellen [user_roles] oder wird Hibernate selbst generieren? Auch in meinen Tabellen sind die ID der Benutzertabelle und die RID der Rollen-Tabelle nur PK. Es gibt keine FK – javaz

+0

, die Sie benötigen, um eine Zwischen-Tabelle zu erstellen – cralfaro