当我在Embedabble中有一个CollectionOfElements时,我似乎得到了一个ConcurrentModificationException。
如果想拥有它,那么如果我将Route从Embedabble更改为Entity,那么一切正常。我甚至尝试过添加@Version,但这似乎不起作用。
以下是我的课程片段。 Kart.java:
@Entity
public class Kart {
@Id @GeneratedValue
private Long id;
@Column(nullable=false,length=256)
@NotNull
@Length(max=256)
private String name;
@OneToOne(cascade=CascadeType.ALL)
private File file;
@Version
private int version;
@CollectionOfElements
private Set<Route> route;
Route.java:
@Embeddable
public class Route {
@Parent
private Kart kart;
@NotNull
@Column(nullable = false, length = 256)
private String name;
@NotNull
@Column(nullable = false)
private Boolean visible = Boolean.valueOf(true);
@CollectionOfElements
private Set<Coordinates> coordinates;
@Version
private int version;
Coordinates.java:
@Embeddable
public class Coordinates {
@NotNull
private int x;
@NotNull
private int y;
@Parent
private Route route;
@Version
private int version;
我为Coordinates和Route
生成了Hashcode / equals答案 0 :(得分:9)
检查此JIRA条目。
ConcurrentModificationException when collection of embeddable contains a collection
这是Annotation Binder中的已知错误。而问题在于Hibernate Core,它不支持嵌入式集合中的集合。
答案 1 :(得分:3)
我无法向您提供任何特定于Hibernate的建议 - 但ConcurrentModificationExceptions通常意味着在其迭代器中修改了一个集合,例如
for (String s : myStringCollection)
{
if (s.startsWith("XXX"))
{
myStringCollection.remove(s);
}
}
通常你可以通过显式创建一个Iterator并调用它的 remove()方法而不是Collection的来避免这种情况 - 但是如果这是内部Hibernate代码你将没有那个选项。
答案 2 :(得分:0)
“@CollectionOfElements”和“@Embeddable”的使用令人困惑。我假设您希望Route和Coordinates是单独的表?如果是这样,他们真的不应该是@Embeddable。 @Embeddable表示可嵌入父表的内容。例如,要使用复合键,通常使用@EmbeddedId作为PK,它链接到@Embeddable的类。
由于您提到切换到Entity似乎解决了问题,我认为您应该将Route和Coordinate切换为单独的实体。然后你将有一个更标准的模型设置,它可以解决你的问题。