使用在表中不是唯一的Hibernate MapKey

时间:2010-03-10 16:37:53

标签: hibernate jpa

这是一个Hibernate / JPA问题。

我有一组Schedule个对象,每个对象包含多个StepStepType个。每个StepType在计划中都是唯一的,因此步骤存储为Map<StepType, Step>。代码注释为:

@Entity
public class Schedule implements Serializable {
    @MapKey(name="type")
    @OneToMany(cascade=CascadeType.ALL, mappedBy="schedule")
    private Map<StepType, Step> steps;
}

@Entity
@Table(uniqueConstraints={@UniqueConstraint(columnNames={"schedule", "type"})})
public class Step implements Serializable {
    @ManyToOne
    private StepType type;

    @ManyToOne
    private Schedule schedule;
}

不幸的是,这显然是不允许的。 MapKey需要具有与之关联的唯一性约束,而type则不会,因为步骤类型在特定计划中仅是唯一的。

有没有更好的方法来注释这个结构,还是我不得不重新考虑Hibernate的对象模型呢?或者这种违规行为是否无害? (地图拒绝正确加载,但我无法确认这就是原因。)

1 个答案:

答案 0 :(得分:0)

根据规范,你是对的,需要唯一性。但根据我(和你)的说法,只需要“本地化的唯一性”似乎是合乎逻辑的。 我刚刚发现“Pro JPA 2”书中也有相同的说法:“不要求在这个实体类型的整个域中都是唯一的。它只需要在关系范围内是唯一的。”

我需要与你完全相同的行为。我很快就会测试代码。

这是本书摘录的链接: http://books.google.com/books?id=j84hdeHH2PYC&pg=PA119&lpg=PA119&dq=jpa+mapkey+uniqueness&source=bl&ots=C_TluOiJxZ&sig=EibqwD-3slqk7pnEJDK38k4T6Zc&hl=fr&ei=147MTJLTHNC6jAecuanYBw&sa=X&oi=book_result&ct=result&resnum=9&ved=0CEgQ6AEwCA#v=onepage&q=t%20should%20also%20be%20unique%2C%20although%20it%20is%20not%20&f=false