Java Hibernate@EmbeddedId强制级联,这是可以预防的吗?
我在一个Java Hibernate@EmbeddedId强制级联,这是可以预防的吗?,java,hibernate,jpa,jpa-2.2,Java,Hibernate,Jpa,Jpa 2.2,我在一个OneToMany关系上进行级联并使用embeddedId时遇到问题。我会把我的实体放在这篇文章的底部作为参考 问题是,即使我将级联类型作为关系两侧的空数组;在调用的ManyToOne端使用embeddedId时,任何合并任一实体的尝试都会导致与级联类型相同的行为。所有 总结如下: 如果我在JMTest类中使用EmbeddedId,当我在AltMunchTest上调用entitiyManager.merge时,它还会尝试合并tests列表中的任何JMTest对象。如果我删除Embedde
OneToMany
关系上进行级联并使用embeddedId
时遇到问题。我会把我的实体放在这篇文章的底部作为参考
问题是,即使我将级联类型
作为关系两侧的空数组;在调用的ManyToOne
端使用embeddedId
时,任何合并
任一实体的尝试都会导致与级联类型相同的行为。所有
总结如下:
如果我在JMTest
类中使用EmbeddedId
,当我在AltMunchTest
上调用entitiyManager.merge
时,它还会尝试合并tests
列表中的任何JMTest
对象。如果我删除EmbeddedId
用法,只使用一个主键而不是复合键,那么级联就可以按预期工作。我不明白为什么会发生这种情况,我在文档中没有看到任何东西表明EmbeddedId
或MapsId
注释应该影响级联
实体:
public class AltMunchTest {
@Id
@GenericGenerator(name = "generator", strategy = "uuid")
@GeneratedValue(generator = "generator")
public String id;
@OneToMany(
fetch = FetchType.LAZY,
mappedBy = "munch"
)
public List<JMTest> tests = new ArrayList<>();
}
混淆视听之后,罪魁祸首似乎就是这个注释
@MapsId(“munchId”)
,因为某种原因,在合并刷卡或刷卡时,这个指定的力会层叠。我已经从embeddedId中删除了它和munchId
字段,一切都正常工作。如果有人能解释原因,我会很高兴的
@Table(name = "MTest")
public class JMTest implements Serializable {
@EmbeddedId
public JTestId jid;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "munchId")
@MapsId("munchId")
public AltMunchTest munch;
@Override
public boolean equals(Object o) {
if (this == o) { return true; }
if (o == null || getClass() != o.getClass()) { return false; }
JMTest jmTest = (JMTest) o;
return Objects.equals(jid, jmTest.jid);
}
@Override
public int hashCode() {
return Objects.hash(jid);
}
}
public class JTestId implements Serializable {
@Column
public String munchId;
@Column
public String id;
@Override
public boolean equals(Object o) {
if (this == o) { return true; }
if (o == null || getClass() != o.getClass()) { return false; }
JTestId jTestId = (JTestId) o;
return Objects.equals(munchId, jTestId.munchId) &&
Objects.equals(id, jTestId.id);
}
@Override
public int hashCode() {
return Objects.hash(munchId, id);
}
}