【发布时间】:2018-09-08 07:35:49
【问题描述】:
我知道这已经被问过很多次了,我知道是因为我已经搜索了与我的问题相关的每个问题以尝试找到解决方案,但是,没有一个建议的解决方案对我有用,我'我很确定我一定错过了什么。
人物类:
@Entity
@Table(name = "person", schema = "test")
public class PersonEntity {
@Id
@Column(name = "id")
private long id;
@Basic
@Column(name = "name")
private String name;
@Basic
@Column(name = "age")
private int age;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "personid")
private List<ProjectEntity> projects;
}
项目类:
@Entity
@Table(name = "project", schema = "test")
public class ProjectEntity {
@Id
@Column(name = "id")
private long id;
@Basic
@Column(name = "name")
private String name;
@Basic
@Column(name = "budget")
private int budget;
@JoinColumn(name = "personid", referencedColumnName = "id")
@ManyToOne(cascade = CascadeType.ALL)
private PersonEntity personid;
}
我有一个双向的 OneToMany/ManyToOne 关系,我尝试过改变 将级联类型添加到 PERSIST,添加 'optional=false' 和更多的东西,但似乎没有任何效果。
我读到我必须在持久化之前手动“加入”实体,这就是我所做的:
em = JPAUtility.getEntityManager();
em.getTransaction().begin();
PersonEntity personTest = new PersonEntity();
personTest.setName("Test");
personTest.setAge(23);
ProjectEntity projectTest = new ProjectEntity();
projectTest.setName("hello");
projectTest.setBudget(232);
projectTest.setPersonid(personTest);
List<ProjectEntity> projects = new ArrayList<ProjectEntity>();
projects.add(projectTest);
personTest.setProjects(projects);
em.persist(personTest);
em.getTransaction().commit();
em.close();
return personTest;
但我还是明白了:
Caused by:
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:
Cannot add or update a child row: a foreign key constraint fails
(`test`.`project`, CONSTRAINT `FK_Personid` FOREIGN KEY (`personid`) REFERENCES
`person` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)
老实说,我不知道自己错过了什么,如果有人有任何建议,我将非常乐意尝试。
非常感谢!
解决方案
感谢所有建议,我设法解决了这个问题,基本上,我错过了我删除的 @GeneratedValue(strategy=GenerationType.AUTO) 注释,因为我认为它不起作用但是它不起作用,因为我错过了一个属性persistence.xml:
<property name="hibernate.id.new_generator_mappings" value="false" />
您还需要一个方法来在对象中添加关系:
public void addToProjects(ProjectEntity project){
project.setPersonid(this);
this.projects.add(project);
}
要完成这项工作,您需要在声明变量时初始化 List:
private List<ProjectEntity> projects = new ArrayList<ProjectEntity>();
就是这样!
这是最终的工作代码,以防任何人发现它有用:):
人物类:
@Entity
@Table(name = "person", schema = "test")
public class PersonEntity {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name = "id")
private long id;
@Basic
@Column(name = "name")
private String name;
@Basic
@Column(name = "age")
private int age;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "personid")
private List<ProjectEntity> projects = new ArrayList<ProjectEntity>();
public void addToProjects(ProjectEntity project) {
project.setPersonid(this);
this.projects.add(project);
}
}
项目类:
@Entity
@Table(name = "project", schema = "test")
public class ProjectEntity {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name = "id")
private long id;
@Basic
@Column(name = "name")
private String name;
@Basic
@Column(name = "budget")
private int budget;
@JoinColumn(name = "personid", referencedColumnName = "id")
@ManyToOne(cascade = CascadeType.PERSIST)
private PersonEntity personid;
public void setPersonid(PersonEntity personid) {
this.personid = personid;
}
}
确保将孩子添加到他们的父母,反之亦然(addToProjects())
em = JPAUtility.getEntityManager();
em.getTransaction().begin();
PersonEntity personTest = new PersonEntity();
personTest.setName("Butters");
personTest.setAge(10);
ProjectEntity projectTest = new ProjectEntity();
projectTest.setName("Hanks");
projectTest.setBudget(10000);
ProjectEntity projectTest2 = new ProjectEntity();
projectTest2.setName("X");
projectTest2.setBudget(100);
personTest.addToProjects(projectTest);
personTest.addToProjects(projectTest2);
em.persist(personTest);
em.getTransaction().commit();
em.close();
希望对您有所帮助!非常感谢。
【问题讨论】:
-
先保存 PersonEntity,然后将保存的实体添加到 ProjectEntity,然后保存 ProjectEntity。项目需要 Person 才能持久化。
-
“我已经搜索了与我的问题相关的所有问题以尝试找到解决方案,但是,没有一个建议的解决方案对我有用......” 我认为你这样做是错误的。我建议阅读相关的问答,以深入了解/理解像您这样的问题。然后用这些知识来解决你的问题。
-
@ObiWan-PallavJha 感谢您的建议!不幸的是,它似乎不起作用:/。我在
project.setPersonId(personTest)之前添加了em.persist(personTest);,然后:em.persist(projectTest)。我有错吗? -
@StephenC 你是 101% 正确的,我没有正确解释自己。这不像我只是在寻找解决方案并试图仅仅为了它而应用它们。我已经阅读了很多问答,试图了解我做错了什么,我已经看过教程,阅读了文档等。不过,我无法让它工作,我有点绝望,这就是我尝试的原因现在什么都可以。非常感谢您的建议。
标签: java mysql hibernate jpa persist