Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.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 双向一对多,其中一方为拥有方_Java_Hibernate_Jpa_One To Many_Bidirectional - Fatal编程技术网

Java 双向一对多,其中一方为拥有方

Java 双向一对多,其中一方为拥有方,java,hibernate,jpa,one-to-many,bidirectional,Java,Hibernate,Jpa,One To Many,Bidirectional,难道没有办法让“一”成为一对多关系的所有者吗?每个样本都有@OneToMany中的mappedBy。甚至连答案都有 我希望一方成为拥有方,因为当我添加多个/子对象时,我还更改了一个/父对象的一些信息,我只想更新父对象,以简化代码并确保所有内容都在同一个ACID事务中 但我就是做不到。Hibernate一直在抱怨 实体映射中的重复列 我的实体: public class Parent { @Id @GeneratedValue(strategy = GenerationType.

难道没有办法让“一”成为一对多关系的所有者吗?每个样本都有
@OneToMany
中的
mappedBy
。甚至连答案都有

我希望一方成为拥有方,因为当我添加多个/子对象时,我还更改了一个/父对象的一些信息,我只想更新父对象,以简化代码并确保所有内容都在同一个ACID事务中

但我就是做不到。Hibernate一直在抱怨

实体映射中的重复列

我的实体:

public class Parent {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @OneToMany(fetch = EAGER, cascade = {ALL}, orphanRemoval = true)
    @JoinColumn(name = "parent_id", referencedColumnName = "id", nullable = false)
    private final Set<Child> children = new HashSet<>();

}

public class Child {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @ManyToOne
    private Parent parent;

}
公共类父类{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私有整数id;
@OneToMany(fetch=EAGER,cascade={ALL},orphanRemoving=true)
@JoinColumn(name=“parent\u id”,referencedColumnName=“id”,nullable=false)
private final Set children=new HashSet();
}
公营儿童{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私有整数id;
@许多酮
私人家长;
}
解决实体错误映射中重复列的问题

您可以从
@JoinColumn
注释中删除
nullable=false
,如下所示:

而不是

@JoinColumn(name = "parent_id", referencedColumnName = "id", nullable = false)
试一试

@JoinColumn(name = "parent_id", referencedColumnName = "id", insertable = false, updatable = false)
但是如果您想保留
nullable=false
,那么

移除
私有父级来自
子类的声明

使用
@transient
注释或
私有瞬态父项使其成为瞬态

你有什么

@JoinColumn(name = "parent_id", referencedColumnName = "id")
这和

@OneToMany(mappedBy="parent", fetch = FetchType.EAGER, cascade = {CascadeType.ALL}, orphanRemoval = true)
表面上看。你这样做的动机是什么


编辑:是的,好的。你坚持双向关系的方式是不同的。如果使用
mappedBy
,则必须设置父级,如果使用
@JoinColumn
,则不必设置父级,但前提是删除
insertable=false,updateable=false`,因此我不确定为什么要讨论必须包含这些内容。另外,我不知道为什么会出现hibernate重复列错误,我没有得到类似的结果。需要注意的是,保存子级时需要CascadeType.ALL,而不必设置父级。

您的部分判断是正确的。我不得不用
insertable=false,updateable=false
@user384729替换
nullable=false
,这是一个很好的观点。通过包含
insertable=false,updateable=false
它不会触发额外的更新查询;否则我就大错特错了。我认为我所拥有的(你的第一个代码片段)使我的
父母成为关系的拥有方。因此,我不需要手动持久化新的
子项。我可以将其添加到父级并更新父级。对于您的第二个代码片段,
Child
将是拥有方。我需要执行
child.setParent(parent)
并手动保存它,childDao.save(child)`。你能让它工作吗?我遇到了完全相同的问题。