2016-02-22 140 views
0

我有3个要素是这样的:JPA映射键使用嵌套属性

public class ItemType { 
    @Id 
    private Long id = null; 
    ... 
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true, mappedBy = "itemTypeVO") 
    @MapKey(name = "company.id") 
    private Map<Long, ItemTypePurpose> purposeHash = null; 
    ... 
} 


public class ItemTypePurpose { 
    @Id 
    private Long id = null; 
    ... 
    @ManyToOne(fetch = FetchType.LAZY, optional = false) 
    @JoinColumn(name = "idcompany") 
    private Company company = null; 
    ... 
} 

public class Company { 
    @Id 
    private Long id = null; 
    ... 
} 

我的问题是,我想公司的ID为我的地图内的ItemType的关键。

我可以编译和部署应用程序没有任何错误。可以坚持ItemType,并且一切顺利到DB。但是当我把它拿回来时,Map键是“错误的”,我不知道正在使用什么信息,但肯定它不是公司ID。也许ItemTypePurpose的ID。

公司正在被正确加载到地图中,只是地图关键是错误的。我尝试谷歌,BU找不到任何东西。有没有办法让JPA用这个“嵌套属性”创建我的地图?

*对不起我的英语,如果你明白我需要什么,可以用英文写一篇更好的文章来编辑我的问题。

+1

我怀疑大多数人会使用公司实例本身作为地图的关键。 – Chris

+0

可能是一个解决方案,取决于equals()和hash()实现以及在对象内部填充的数据,否则映射上的“get()”操作可能不会返回您的对象... –

回答

0

这并不完全解决问题,但现在解决我的需求。

由于公司的阙ID是ItemTypePurpose的表,我可以映射键更改为:

public class ItemType { 
    @Id 
    private Long id = null; 
    ... 
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true, mappedBy = "itemTypeVO") 
    @MapKeyColumn(name = "idcompany", insertable = false, updatable = false) 
    private Map<Long, ItemTypePurpose> purposeHash = null; 
    ... 
} 

相反@MapKey的,我用@MapKeyColumn。 @MapKeyColumn(name = "idcore_company", insertable = false, updatable = false是将“关键信息”只读并且避免映射冲突,因为在ItemTypePurpose中使用相同的列来映射实体。

不完全是一个答案,但“解决”解决我的需求。如果你想要一个字段作为地图密钥而不是ID,这个解决方案不会覆盖。