Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.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_Jpa - Fatal编程技术网

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方法来解决 处理关系的双方,因此应用程序代码 不用担心。有两种方法可以做到这一点, 您可以只向一侧添加关系维护代码 的关系,并且仅使用