Я пытаюсь сохранить требуемый объект, у которого есть 1 первичный ключ 2 родительских объекта (тип / пользователь). ошибка:
HTTP Status 500 - Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: object references an unsaved transient instance - save the transient instance before flushing: jpa.project.model.DemUser; nested exception is org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: jpa.project.model.DemUser
запрос:
@Id
@SequenceGenerator(name="DEM_DEMANDE_IDDEMANDE_GENERATOR", sequenceName="SEQ_DEM_DEMANDE")
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="DEM_DEMANDE_IDDEMANDE_GENERATOR")
@Column(name="ID_DEMANDE")
private long idDemande;
@ManyToOne
@JoinColumn(name="ID_TYPE_DEMANDE")
private DemTypeDemande demTypeDemande;
@ManyToOne
@JoinColumn(name="ID_DEM_USER")
private DemUser userDemande;
пользователь:
@Id
@SequenceGenerator(name="DEM_USER_IDUSER_GENERATOR", sequenceName="SEQ_DEM_USER")
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="DEM_USER_IDUSER_GENERATOR")
@Column(name="ID_USER")
private long idUser;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="ID_ROLE")
private DemRole idRole;
@Column(name="NAME_USER")
private String nameUser;
private String password;
@OneToMany(mappedBy="userDemande")
private List<DemDemande> demDemandes;
требуемый тип:
@Id
@SequenceGenerator(name="DEM_TYPE_DEMANDE_IDTYPEDEMANDE_GENERATOR", sequenceName="SEQ_DEM_TYPE_DEMANDE")
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="DEM_TYPE_DEMANDE_IDTYPEDEMANDE_GENERATOR")
@Column(name="ID_TYPE_DEMANDE")
private long idTypeDemande;
@Column(name="LIB_TYPE_DEMANDE")
private String libTypeDemande;
@OneToMany(mappedBy="demTypeDemande")
private List<DemDemande> demDemandes;
контроллер:
@Controller
public class DemandeController {
@Autowired
ProjectService service ;
@RequestMapping(value = "/demandes/manage",method = RequestMethod.GET)
public String manageUsers(HttpServletRequest request,Model model) throws IOException {
//----set types demande list
List<DemTypeDemande> listTypeDemandes = service.getTypeDemandes();
model.addAttribute("listTypeDemandes", listTypeDemandes);
//----retrieve connected user
String ConnectedUsername = service.getConnectedUsername(request);
DemUser currentUser = service.getUserByUsername(ConnectedUsername);
model.addAttribute("demUser", currentUser);
//add demande object
DemDemande demande = new DemDemande();
model.addAttribute("DemDemande", demande);
return "managedemandes";
}
@RequestMapping(value = "/demandes/actionadddemande", method = RequestMethod.POST)
public String actionadduser(HttpServletRequest request
,@ModelAttribute ("demTypeDemande") DemTypeDemande typeDemande,@ModelAttribute ("demUser")DemUser currentUser,
@ModelAttribute ("DemDemande") DemDemande demande , BindingResult result) {
demande.setDemUser(currentUser); demande.setDemTypeDemande(service.getTypeDemande(Long.valueOf(request.getParameter("demTypeDemande"))));
service.addDemande(demande);
currentUser.addDemDemande(demande) ;
return "redirect:/demandes/manage";
}
}
JSP:
<div align="center">
<h1>New Demande</h1>
<form:form action="actionadddemande" method="POST" commandName="DemDemande">
<table>
<form:hidden path="idDemande" />
<form:hidden path="demUser" />
<tr>
<td>Types :</td>
<td>
<form:select path="demTypeDemande">
<form:options items="${listTypeDemandes}" itemValue="idTypeDemande" itemLabel="libTypeDemande"></form:options>
</form:select></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" value="Save"></td>
</tr>
</table>
</form:form>
</div>