2010-03-10 35 views
0

这是一个Hibernate/JPA问题。使用在表格中不唯一的Hibernate MapKey

我有一套Schedule对象,每个对象包含各种StepType的几个Step s。每个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的对象模型?或者这种违规行为应该是无害的? (该地图拒绝正确加载,但我无法确认这是为什么。)

+0

我有同样的问题。这种方法是否适合你? – 2012-07-13 08:55:40

回答

0

根据规范,您说得对,需要unicity。但根据我(和你)的说法,只要求“本地化的单一性”似乎是合乎逻辑的。 我已经证明“Pro JPA 2”书中陈述的是相同的:“不需要在这个实体类型的整个域中是唯一的,它只需要在关系的全部范围内是唯一的”。

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

这里的书的exerpt链接: 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