Java 使用JoinColumn休眠保存或更新

Java 使用JoinColumn休眠保存或更新,java,sql,spring,hibernate,spring-mvc,Java,Sql,Spring,Hibernate,Spring Mvc,如果创建一个新实体时有一个连接列,我会遇到问题 实体: @ 如果我发送此json: { "name": "prova3", "language": "1", "start_date": "15-04-2018", "end_date": "26-04-2018" } 结果是: Hibernate: insert into projects (id_content_manager, end_date, project_language, project_name

如果创建一个新实体时有一个连接列,我会遇到问题

实体:

@

如果我发送此json:

{
    "name": "prova3",
    "language": "1",
    "start_date": "15-04-2018",
    "end_date": "26-04-2018"

}
结果是:

Hibernate: insert into projects (id_content_manager, end_date, project_language, project_name, start_date, id_project) values (?, ?, ?, ?, ?, ?)
WARN : org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL Error: 1452, SQLState: 23000
ERROR: org.hibernate.engine.jdbc.spi.SqlExceptionHelper - Cannot add or update a child row: a foreign key constraint fails (`dipp`.`projects`, CONSTRAINT `projects_user_id_user_fk` FOREIGN KEY (`id_project`) REFERENCES `user` (`id_user`) ON DELETE CASCADE ON UPDATE CASCADE)
ERROR: org.hibernate.internal.ExceptionMapperStandardImpl - HHH000346: Error during managed flush [org.hibernate.exception.ConstraintViolationException: could not execute statement]
保存实体的方法:

public void newProject(Project project) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        Transaction tx = null;

        tx = session.beginTransaction();

        if(session != null) {
            try {
                session.save(project);
                tx.commit();
                session.close();
            }catch(Exception ex) {
                session.close(); 
            }
        }
    }
有人能帮我解决吗? 我需要了解如何将参数“contentManager”作为可选参数传递,以便只传递id,然后通过find函数检索所有内容并将其传递给contentManager

编辑:

控制员:

@RequestMapping(value = "/", method = RequestMethod.POST, consumes = "application/json" , produces = "application/json")
    public @ResponseBody ResponseEntity<BaseModel> newProject( @RequestHeader(value="Authorization") String token, @RequestBody Project project, Locale locale) throws ParseException{
        if(!SecurityUtil.validateToken(token)) {
            return new ResponseEntity<BaseModel>(new BaseModel("error", MessageHandler.returnMessage("invalid_token", locale)), HttpStatus.UNAUTHORIZED);
        }
        User contentManager = new User();
        logger.info(project.getContentManager().getId().toString());
        if(project.getContentManager().getId() != null) {
            logger.info("have id");
            contentManager = userDao.find(project.getContentManager().getId());
        }
        project.setContentManager(contentManager);
        projectDao.newProject(project);
        return new ResponseEntity<BaseModel>(new BaseModel("ok", project.getId()), HttpStatus.OK);
    }
@RequestMapping(value=“/”,method=RequestMethod.POST,consumes=“application/json”,products=“application/json”)
public@ResponseBody ResponseEntity newProject(@RequestHeader(value=“Authorization”)字符串标记,@RequestBody项目,Locale-Locale)引发异常{
如果(!SecurityUtil.validateToken(令牌)){
返回新的ResponseEntity(新的BaseModel(“错误”,MessageHandler.returnMessage(“无效的_令牌”,区域设置)),HttpStatus.UNAUTHORIZED);
}
用户contentManager=新用户();
logger.info(project.getContentManager().getId().toString());
if(project.getContentManager().getId()!=null){
logger.info(“拥有id”);
contentManager=userDao.find(project.getContentManager().getId());
}
项目。setContentManager(contentManager);
projectDao.newProject(项目);
返回新的ResponseEntity(新的BaseModel(“ok”,project.getId()),HttpStatus.ok);
}

这不是答案。下面是我所做的,这可能会帮助你。在使用它之前,我初始化它并设置它,然后将其设置为在父实体中使用

Icon icon = new Icon();
icon.setIconPath(MiscUtils.getUserIconPath(user));
icon.setUser(user);
user.setIcon(icon);

问题在于外键
projects\u user\u id\u user\u fk
删除“更新时级联”并设置“更新时无操作”,因为当您插入id时,它会尝试更新用户表,您可能会尝试使用空用户保存项目。

根据我的经验,如果您使用关系,我们需要先插入关系,然后与父级关联。@LearningPhase afaik这就是关系中的级联设置的目的。不过,这取决于OP是如何处理用户的……从“manytone”关系中删除“cascade=CascadeType.ALL”。级联在“用户”实体中可能更有用。你可能试图用空用户保存项目。@AdamLesiak结果是samenope,我编辑了这篇文章,但用这种方法不起作用。非常感谢你的帮助,除了你的建议,我意识到我错把外键danto的“id\u project”和“id\u user”当成了“id\u content\u manager”和“id\u user”
Icon icon = new Icon();
icon.setIconPath(MiscUtils.getUserIconPath(user));
icon.setUser(user);
user.setIcon(icon);