【问题标题】:Hibernate save or update with JoinColumn使用 JoinColumn 进行休眠保存或更新
【发布时间】:2018-09-29 08:32:32
【问题描述】:

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

实体:

@

Entity
@Table(name = "projects")
public class Project {

    @Id
    @GeneratedValue(generator="increment")
    @GenericGenerator(name="increment", strategy = "increment")
    @Column(name = "id_project")
    private Long id;

    @Column(name = "project_name")
    private String name;

    @JsonInclude(value = Include.NON_NULL)
    @Column(name = "project_language")  
    private String language;

    @Temporal(TemporalType.DATE)
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy")
    @Column(name = "start_date")
    private Date start_date;

    @Temporal(TemporalType.DATE)
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy")
    @Column(name = "end_date")
    private Date end_date;

    @NotFound(action = NotFoundAction.IGNORE)
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name = "id_content_manager")
    private User contentManager;

如果我发送这个 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);
    }

【问题讨论】:

  • 根据我的经验,如果你是一个关系,我们需要先插入关系,然后与父关联。
  • @LearningPhase afaik 这就是关系中的级联设置。但是,这取决于 OP 如何与用户打交道...
  • 从“ManyToOne”关系中删除“cascade = CascadeType.ALL”。级联在“用户”实体中更有用。您可能尝试使用空用户保存项目。
  • @AdamLesiak 结果是一样的

标签: java sql spring hibernate spring-mvc


【解决方案1】:

问题在于外键 projects_user_id_user_fk 删除“ON UPDATE CASCADE”并设置“ON UPDATE NO ACTION”,因为当您插入 id 时,它会尝试更新用户表,您可能会尝试使用空用户保存项目.

【讨论】:

  • 非常感谢您的帮助,除了您的建议外,我意识到我把 danto 的外键“id_project”和“id_user”弄错了,而不是“id_content_manager”和“id_user”
【解决方案2】:

这不是答案。下面是我的做法,希望对你有所帮助。在使用它之前,我对其进行初始化并设置然后将其设置为在父实体中使用。

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

【讨论】:

  • 不,我编辑了帖子,但这种方法不起作用
猜你喜欢
  • 2011-09-20
  • 1970-01-01
  • 2014-06-10
  • 2011-11-06
  • 2012-01-18
  • 2013-06-09
  • 2012-08-09
  • 2012-10-17
  • 1970-01-01
相关资源
最近更新 更多