Java JPA一对一/多对一关系不起作用-我错过了什么?
我知道这已经被问了很多次了,我知道这是因为我已经搜索了与我的问题相关的每一个问题,试图找到一个解决方案,然而,没有一个建议的解决方案对我有效,我很确定我必须错过一些东西 人员类别:Java JPA一对一/多对一关系不起作用-我错过了什么?,java,mysql,hibernate,jpa,persist,Java,Mysql,Hibernate,Jpa,Persist,我知道这已经被问了很多次了,我知道这是因为我已经搜索了与我的问题相关的每一个问题,试图找到一个解决方案,然而,没有一个建议的解决方案对我有效,我很确定我必须错过一些东西 人员类别: @Entity @Table(name = "person", schema = "test") public class PersonEntity { @Id @Column(name = "id") private long id; @Basic @Column(name
@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 = "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);
}
}
private List<ProjectEntity> projects = new ArrayList<>();
我有一种双向的一对一/多对一关系,我尝试过改变
cascade类型持续存在,添加了'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;
老实说,我不知道我错过了什么,如果有人有任何建议,我将非常乐意尝试
非常感谢你
解决方案 由于所有的建议,我成功地解决了这个问题,基本上,我缺少了
@GeneratedValue(strategy=GenerationType.AUTO)
注释,我删除了该注释,因为我认为它不起作用,但它不起作用,因为我缺少persistence.xml上的一个属性:
您还需要一种方法来在对象中添加关系:
public void addToProjects(ProjectEntity项目){
project.setPersonid(本);
this.projects.add(项目);
}
要实现此功能,您需要在声明变量时初始化列表:
private List projects=new ArrayList()代码>
就这样
这是最后的工作代码,以防任何人发现它有用:):
人员类别:
@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 = "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);
}
}
private List<ProjectEntity> projects = new ArrayList<>();
确保将子项添加到其父项,反之亦然(addToProjects())
希望有帮助!非常感谢。我能想到几条线索,因为我不止一次遇到这种问题:
除非您希望通过项目
中的级联操作来更新您的人员
,否则您应该删除
@多通(级联=级联类型.ALL)
从您的personid
属性
尝试更新您的项目
集合,而不是创建一个新集合,因为如果它已经由Hibernate管理(不需要),则将对旧集合和新集合执行持久/合并操作
人员类别:
@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 = "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);
}
}
private List<ProjectEntity> projects = new ArrayList<>();
我通常更喜欢merge
而不是persist
,因为我发现它更“自然”,有时,输出明显不一样。您需要注意的主要问题是正确定义关系的拥有方(有时很难理解)官方文件是,拥有方几乎是默认触发级联和透明删除的一方
例如,在上面,您已经将拥有方定义为ProjectEntity
,因此级联持久性工作的最重要步骤是将项目添加到PersonEntity.projects
然后,您需要在关系的拥有方调用persist
,即
em.persist(projectTest);
如果这没有帮助,我建议您在JPA提供程序中启用SQL日志记录,以了解它试图执行的语句,尤其是这些实体被插入的顺序
另外,根据现有的注释,尝试坚持“个人优先”。
如果您这样做,我认为正确的方法是将持久化的实体添加到关系中,即:
PersonEntity persistedPerson = em.persist(personTest);
projectTest.setPersonId(persistedPerson);
em.persist(projectTest);
我也遇到了同样的问题。一个@ManyToOne
无故不工作,有两个类。我添加了@GeneratedValue(strategy=GenerationType.AUTO)
,但它并没有解决我的问题
我还尝试重命名类、清理、关闭项目、重新启动等,但都没有成功。最后,我删除了文件(以前做了一个副本)并从新文件中重新创建了它们,这解决了我的问题。我使用的是Eclipse 4.8、Spring 2.5、Groovy 2.5和Java 1.8
更新:
不太确定问题出在哪里,无论如何(对于groovy)检查您的保存方法:myUserRepo(new MyUser(“用户名”)、检查您的xxRepo<MyUser,Integer>,并检查您的文件是否为.groovy(最后一个不应该是问题)
其他更新:
如果要在两个表之间创建关系并使用保存结果,请确保在服务上使用@Transactional
,并链接关系字段,例如:
@Transactional
UserAccount save(UserAccount userAccount) {
User user = userRepo.save(new User(userAccount))
UserAccount.setUser(user)
userAccountRepo.save(userAccount)
}
首先保存PersonEntity,然后将保存的实体添加到ProjectEntity,然后保存ProjectEntity。Project需要Person才能持久。“我已经搜索了与我的问题相关的每个问题,试图找到解决方案,但是,没有一个建议的解决方案对我有效…”我认为你这样做是错误的。我建议你阅读相关的问答,以深入了解/理解像你这样的问题。然后利用这些知识来解决你的问题。@ObiWan PallavJha感谢你的建议!不幸的是,它似乎不起作用:/。我添加了em.persist(personTest);
在project.setPersonId(personTest)
之前,然后:em.persist(projectTest)
。我犯了什么错误吗?@StephenC你说得对,我没有正确地解释自己。这并不是说我只是在寻找解决方案,并试图应用它们。我读了很多问答,试图理解我做错了什么,我看了教程,阅读了文档,等等。但是,我仍然无法让它工作,我很抱歉有点绝望,这就是我现在尝试任何事情的原因。非常感谢你的建议。我只是将级联类型更改为持久,比所有类型都好。我无法将项目添加到“原始”列表中,因为它未初始化。private list projects=new ArrayList()这解决了问题,我不知道为什么我没有想到初始化variab