Свойство not-null ссылается на нулевое значение при добавлении нового пользователя с внешним ключом - PullRequest
0 голосов
/ 28 апреля 2020

Я пытаюсь вставить нового пользователя в базу данных, которая содержит внешний ключ для userRole. я заполнил раскрывающийся список ролей в jsp из базы данных, вставленный в форму, в которую я добавлю нового пользователя. я действительно заблокирован на несколько дней ... у пользователя также есть первичный ключ.

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.hibernate.PropertyValueException: not-null property references a null or transient value: jpa.project.model.DemUser.idRole
Роль:
@Entity
@Table(name="DEM_ROLE")
@NamedQuery(name="DemRole.findAll", query="SELECT d FROM DemRole d")
public class DemRole implements Serializable {
    private static final long serialVersionUID = 1L;
    private long idRole;
    private String libRole;
    private String librole;

    public DemRole() {
    }


    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="ID_ROLE", unique=true, nullable=false)
    public long getIdRole() {
        return this.idRole;
    }

    public void setIdRole(long idRole) {
        this.idRole = idRole;
    }


    @Column(name="LIB_ROLE", nullable=false, length=50)
    public String getLibRole() {
        return this.libRole;
    }

    public void setLibRole(String libRole) {
        this.libRole = libRole;
    }


    @Column(length=255)
    public String getLibrole() {
        return this.librole;
    }

    public void setLibrole(String librole) {
        this.librole = librole;
    }

}

Пользователь:

@Entity
@Table(name="DEM_USER")
@NamedQuery(name="DemUser.findAll", query="SELECT d FROM DemUser d")
public class DemUser implements Serializable {
	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	@Column(name="ID_USER", unique=true, nullable=false)
	private long idUser;

	@Column(name="NAME_USER", nullable=false, length=50)
	private String nameUser;

	@Column(nullable=false, length=20)
	private String password;

	//uni-directional many-to-one association to DemRole
	@ManyToOne(cascade={CascadeType.ALL},fetch = FetchType.LAZY)
	@JoinColumn(name="ID_ROLE", nullable=false)
	private DemRole idRole;

	public DemUser() {
	}

	public long getIdUser() {
		return this.idUser;
	}

	public void setIdUser(long idUser) {
		this.idUser = idUser;
	}

	public String getNameUser() {
		return this.nameUser;
	}

	public void setNameUser(String nameUser) {
		this.nameUser = nameUser;
	}

	public String getPassword() {
		return this.password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public DemRole getIdRole() {
		return this.idRole;
	}

	public void setIdRole(DemRole idRole) {
		this.idRole = idRole;
	}

}

<!-- begin snippet: js hide: false console: true babel: false -->
Контроллер:
	@RequestMapping(value = "/",method = RequestMethod.GET)
	public ModelAndView home(ModelAndView model,HttpServletRequest request) throws IOException {
	    List<DemUser> listUsers = service.getAllUsers();
		model.addObject("listUsers", listUsers);		
		
		List<DemRole> listRoles = service.getRoles();
		request.setAttribute("listRoles", listRoles);
		/*List<DemRole> listRoles = service.getRoles();
		model.addObject("listRoles", listRoles); 	*/
		
		DemUser user = new DemUser();
		model.addObject("DemUser", user); 
	   
		model.setViewName("manageusers");
		return model;
	}
	@RequestMapping(value = "/actionadduser", method = RequestMethod.POST)
	public String actionadduser(ModelAndView model,@ModelAttribute DemRole role ,@ModelAttribute DemUser user,BindingResult result) {

        service.addUser(user);
		return "redirect:/";
	}
JSP:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">
   <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
	    <div align="left">
This is manage users
<table border="1">
        <h1>users</h1>
			<tr><td> Names : </td> </tr>
			<c:forEach var="user" items="${listUsers}">
				<tr>
					<td>${user.nameUser}</td>			
				</tr>
			</c:forEach>
		</table>
			    </div>
			    
			    
		    <div align="right">
        <h1>New user</h1>
        <form:form action="actionadduser" method="post" modelAttribute="DemUser">
        <table>
                    <form:hidden path="idUser" />
                     <form:hidden path="password" value="password" />
            <tr>
                <td>Name:</td>
                <td><form:input path="nameUser" /></td>
            </tr>
     			<tr>
				<td>Roles :</td>
				<td>
    <form:select path="idRole">
         <form:options items="${listRoles}"  itemValue="idRole" itemLabel="libRole"></form:options>
    </form:select></td>

</tr>
            <tr>
                <td colspan="2" align="center"><input type="submit" value="Save"></td>
            </tr>
        </table>
        </form:form>
        </div>

</body>
</html>

1 Ответ

0 голосов
/ 28 апреля 2020

Есть пара моментов:

  1. Поскольку роли уже существуют до добавления нового пользователя, поэтому вам не нужно иметь каскадирование любого типа в отображении @ManyToOne, вы можете удалить каскадирование в все.
    //uni-directional many-to-one association to DemRole
    @ManyToOne
    @JoinColumn(name="ID_ROLE", nullable=false)
    private DemRole idRole;
Я вижу, что в вашем методе POST вы получаете DemRole и DemUser и вызываете класс обслуживания для сохранения пользователя, но я нигде не вижу, чтобы вы заполняли полученный объект роли в полученный пользовательский объект. Поскольку у пользователя есть объект Role, поэтому перед сохранением пользовательского объекта необходимо иметь что-то вроде этого:
@RequestMapping(value = "/actionadduser", method = RequestMethod.POST)
    public String actionadduser(ModelAndView model,@ModelAttribute DemRole role ,@ModelAttribute DemUser user,BindingResult result) {

        // set role object to user object
        user.setIdRole(role); // setter for DemRole object.
        service.addUser(user);
        return "redirect:/";
    }

Надеюсь, это поможет, пожалуйста, дайте мне знать, если понадобятся какие-либо дополнительные разъяснения.

...