【发布时间】: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