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);
    }
}