один ко многим проблема Hibernate

Моя пользовательская таблица

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

И мой класс ролей

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

}

из этого admin.jsp при нажатии на пользователей элемент управления переходит к отображению /users

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

отображение контроллера:

@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 это

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

Я пытаюсь установить ассоциацию «один ко многим», используя Hibernate. Одна роль может быть назначена многим пользователям, поэтому роли являются родительской сущностью, а пользователь — дочерней сущностью. У меня есть две таблицы User и Roles... когда я запускаю приложение, я получаю это

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'

Другие части приложения работают нормально. Как мне это сделать? что я делаю неправильно. Пожалуйста помоги.


person javaz    schedule 31.10.2016    source источник


Ответы (2)


Добавьте @ManyToOne в класс User:

@ManyToOne
private Roles roles;

Добавьте mappedBy в Roles класс:

@OneToMany(mappedBy = "roles",fetch = FetchType.LAZY, cascade = CascadeType.ALL)
public List<User> getUser() {
person eparvan    schedule 31.10.2016
comment
Я получаю это: ОШИБКА: org.hibernate.engine.jdbc.spi.SqlExceptionHelper - Неизвестный столбец «user0_.roles_RID» в «списке полей» - person javaz; 01.11.2016
comment
Скорее всего сделать с этой строкой @Column(name = RID). Убедитесь, что у вас есть правильное имя столбца, записанное в соответствии со структурой таблицы. - person Aeseir; 01.11.2016
comment
Я предполагаю, что это как-то связано с первичным ключом и внешним ключом... но я не знаю, что делать и как делать? - person javaz; 01.11.2016
comment
Теперь он работает, но ничего не делает... мне нужно создать отдельную таблицу для определения того, сколько пользователей указано в определенной роли? - person javaz; 01.11.2016

В вашем классе пользователя:

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

И в вашем классе Rol:

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

Это должно работать

person cralfaro    schedule 01.11.2016
comment
мне нужно создать промежуточную таблицу [user_roles] или спящий режим будет генерироваться сам по себе? Также в моих таблицах ID таблицы User и RID таблицы Roles - это просто PK, FK нет. - person javaz; 01.11.2016
comment
вам нужно создать промежуточную таблицу - person cralfaro; 02.11.2016