Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA一对一/多对一关系不起作用-我错过了什么?_Java_Mysql_Hibernate_Jpa_Persist - Fatal编程技术网

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