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)`。你能让它工作吗?我遇到了完全相同的问题。