Java 节省很多
我有两个实体类,用以下方式注释Java 节省很多,java,jpa,Java,Jpa,我有两个实体类,用以下方式注释 @Entity class A { @ManyToMany(mappedBy="A", cascade=CascadeType.ALL) private List<B> b; .. } @Entity class B { @ManyToMany(cascade=CascadeType.ALL) private List<A> a; .. } @实体 甲级{ @许多(mappedBy=“A”,cascade=C
@Entity
class A {
@ManyToMany(mappedBy="A", cascade=CascadeType.ALL)
private List<B> b;
..
}
@Entity
class B {
@ManyToMany(cascade=CascadeType.ALL)
private List<A> a;
..
}
@实体
甲级{
@许多(mappedBy=“A”,cascade=CascadeType.ALL)
私人名单b;
..
}
@实体
B类{
@多个(级联=级联类型.ALL)
私人名单a;
..
}
如果我存储类“B”的一个实例,则关系存储在数据库中,类“A”中的getter将返回B的正确子集。但是,如果我对“A”中的Bs列表进行更改,这些更改是否不会存储在数据库中
我的问题是,我如何使这两个类中的更改“级联”到另一个类
编辑:我尝试过删除mappedBy参数和定义JoinTable(和columns)的不同变体,但找不到正确的组合。您是否尝试过像这样将mappedBy参数添加到类B中的a字段中
@Entity
class B {
@ManyToMany(cascade=CascadeType.ALL, mappedBy = "b")
private List<A> a;
..
}
@实体
B类{
@多个(cascade=CascadeType.ALL,mappedBy=“b”)
私人名单a;
..
}
您是否尝试过像这样将mappedBy参数添加到B类的A字段中
@Entity
class B {
@ManyToMany(cascade=CascadeType.ALL, mappedBy = "b")
private List<A> a;
..
}
@实体
B类{
@多个(cascade=CascadeType.ALL,mappedBy=“b”)
私人名单a;
..
}
是否指定了反向联接列
@Entity
class A {
@ManyToMany(mappedBy="A", cascade=CascadeType.ALL)
private List <B> b;
..
}
@Entity
class B {
@ManyToMany
@JoinTable (
name="A_B",
joinColumns = {@JoinColumn(name="A_ID")},
inverseJoinColumns = {@JoinColumn(name="B_ID")}
)
private List<A> a;
..
}
@实体
甲级{
@许多(mappedBy=“A”,cascade=CascadeType.ALL)
私人名单b;
..
}
@实体
B类{
@许多
@可接合(
name=“A_B”,
joinColumns={@JoinColumn(name=“A_ID”)},
inverseJoinColumns={@JoinColumn(name=“B_ID”)}
)
私人名单a;
..
}
这是假设一个名为a_B的联接表具有列a_ID和B_ID。是否指定了反向联接列
@Entity
class A {
@ManyToMany(mappedBy="A", cascade=CascadeType.ALL)
private List <B> b;
..
}
@Entity
class B {
@ManyToMany
@JoinTable (
name="A_B",
joinColumns = {@JoinColumn(name="A_ID")},
inverseJoinColumns = {@JoinColumn(name="B_ID")}
)
private List<A> a;
..
}
@实体
甲级{
@许多(mappedBy=“A”,cascade=CascadeType.ALL)
私人名单b;
..
}
@实体
B类{
@许多
@可接合(
name=“A_B”,
joinColumns={@JoinColumn(name=“A_ID”)},
inverseJoinColumns={@JoinColumn(name=“B_ID”)}
)
私人名单a;
..
}
假设一个名为a_B的联接表包含a_ID和B_ID列。最短的答案似乎是您不能,这是有意义的。在双向多对多关联中,一侧必须是主关联,用于持久化对基础联接表的更改。由于JPA不会同时维护关联的双方,因此最终可能会出现存储在数据库中后无法重新加载的内存情况。 例如: 如果此状态可以持久化,则在联接表中会出现以下条目:
a1_id, b_id
a2_id, b_id
但在加载时,JPA如何知道您打算只让b知道a2而不是a1?a2不应该知道b呢
这就是为什么您必须自己维护双向关联(并使上面的示例无法访问,即使在内存中也是如此),而JPA将仅根据其一侧的状态持续存在。最短的答案似乎是您不能,这是有意义的。在双向多对多关联中,一侧必须是主关联,用于持久化对基础联接表的更改。由于JPA不会同时维护关联的双方,因此最终可能会出现存储在数据库中后无法重新加载的内存情况。 例如: 如果此状态可以持久化,则在联接表中会出现以下条目:
a1_id, b_id
a2_id, b_id
但在加载时,JPA如何知道您打算只让b知道a2而不是a1?a2不应该知道b呢
这就是为什么您必须自己维护双向关联(并使上面的示例无法访问,即使在内存中也是如此),而JPA只会根据其一侧的状态持续存在。也许a_M的答案中有一个小错误。 我认为应该是: @Entity class B { @ManyToMany @JoinTable ( name="A_B", joinColumns = {@JoinColumn(name="B_ID")}, inverseJoinColumns = {@JoinColumn(name="A_ID")} ) private List a; .. } @实体 B类{ @许多 @可接合( name=“A_B”, joinColumns={@JoinColumn(name=“B_ID”)}, inverseJoinColumns={@JoinColumn(name=“A_ID”)} ) 私人名单a; .. }
也许a_M的回答中有一个小错误。 我认为应该是: @Entity class B { @ManyToMany @JoinTable ( name="A_B", joinColumns = {@JoinColumn(name="B_ID")}, inverseJoinColumns = {@JoinColumn(name="A_ID")} ) private List a; .. } @实体 B类{ @许多 @可接合( name=“A_B”, joinColumns={@JoinColumn(name=“B_ID”)}, inverseJoinColumns={@JoinColumn(name=“A_ID”)} ) 私人名单a; .. } 因为关系是双向的,所以应用程序会更新 关系的一方,另一方也应该得到更新, 并保持同步。在JPA中,正如在Java中一般它是 应用程序或要维护的对象模型的责任 关系。如果您的应用程序添加到 关系,那么它必须添加到另一边 这可以通过对象模型中的add或set方法来解决 处理关系的双方,因此应用程序代码 不用担心。有两种方法可以做到这一点, 您可以只向一侧添加关系维护代码 只从一侧使用setter(例如 使另一侧受到保护),或将其添加到两侧并确保 你避免了无限循环 资料来源: 因为关系是双向的,所以应用程序会更新 关系的一方,另一方也应该得到更新, 并保持同步。在JPA中,正如在Java中一般它是 应用程序或要维护的对象模型的责任 关系。如果您的应用程序添加到 关系,那么它必须添加到另一边 这可以通过对象模型中的add或set方法来解决 处理关系的双方,因此应用程序代码 不用担心。有两种方法可以做到这一点, 您可以只向一侧添加关系维护代码 的关系,并且仅使用