Hibernate持久化引用的实体而没有cascade = PERSIST

时间:2013-07-13 09:17:04

标签: java hibernate jpa-2.0

我有一张儿童餐桌,每个儿童餐桌都有一套不同的玩具。有一个表存储每个可用玩具的代码。

@Entity
public class Child implements Serializable {
    @Id
    @GeneratedValue
    private int id;

    @OneToMany( mappedBy = "child", fetch = FetchType.EAGER, cascade = CascadeType.PERSIST )
    private Set<Toy> toys = new HashSet<>();

    // getters & setters
}

@Entity
public class ToyCode implements Serializable {
    @Id
    private int id;

    // getters & setters
}

@Entity
public class Toy implements Serializable {
    @EmbeddedId
    private ToyPK id = new ToyPK();

    @MapsId( "childId" )
    @ManyToOne
    private Child child;

    @MapsId( "toyId" )
    @ManyToOne  // <-- there is no cascade=CascadeType.PERSIST
    private ToyCode toyCode;

    // getters & setters
}

虽然Toy类的toyCode成员具有非级联属性,但Hibernate仍然坚持它。

Child elena = new Child();
Toy barbie = new Toy();
barbie.setChild( elena );
barbie.getId().setChildId( elena.getId() );
barbie.getId().setToyId( 4218 );
barbie.setToyCode( new ToyCode( 4218 ) );
elena.addToy( barbie );
em.persist(elena);

我在ToyCode表中没有4218记录,但Hibernate创建了它。

我错了吗?这是正确的行为还是我应该提交错误?如果它是正确的,我如何防止Hibernate保存新的玩具代码?

1 个答案:

答案 0 :(得分:0)

这是预期的行为。当您使用@MapsId映射实体时,您也会得到级联PERSIST。这似乎是合乎逻辑的,因为@MapsId("toyId")需要指向具有该主键值的现有实体。

请参阅此JIRA问题:https://hibernate.atlassian.net/browse/HHH-4858