2011-03-11 327 views
1

度过了我的方式太热门从昨天的问题:JPA映射一个地图实体

Hibernate(JPA) mapping a HashMap

我试图映射结构基本上是以下几点:

Map<User, List<POJOWithComposite>> 

User是一个基本的模式,类似以下内容:

@Entity 
public class User extends Model { 
    public String username; 
    public String password; 
    ... 
} 

POJOWithComposite是另一个实体,具有某些映射实体和一些原语,类似于:

@Entity 
public class POJOWithComposite extends Model { 
    public int someIntField; 
    public OtherModel compositeEntity; 
    ... 
} 

结构可能是类似于一个购物车。因此,User包含帐户信息,OtherModel可能是可购买的商品,POJOWithComposite是包含商品和数量的购物车。比方说,当我谈到主要对象时,我的比喻会有点失败,但是我会幽默,并且让我们说,在每次会议中,我们都会将用户支付的购物车添加到列表中,然后将其存档。首先,如果列表属于每个用户,我可以将其添加到User模型,尽管我觉得这不是非常模块化(即信息不是真正的用户帐户信息)。自动柜员机,这张地图坐落在一个类似公用事业的购物类中,该购物类负责将购物车与购物者相匹配,从而使我无法使User模型变得太大。 (这里有更好的模式吗?)

假设我继续沿着这条路走,试试这个Map。理想情况下,我希望能够按原样映射它。虽然我没有那么幸运。

我偶然发现了一些关于映射ArrayList的讨论,因为它是Serializable,尽管在这里没有设法实现。

所以我做了一个包装单位:

@Entity 
public class POJOWithCompositeList extends Model { 
    @OneToMany 
    List<POJOWithComposite> list = new ArrayList<POJOWithComposite>(); 
} 

这工作。当我使用这个实体就是这样,我可以映射我的新:

@ManyToMany 
Map<User, POJOWithCompositeList> 

虽然我真的不喜欢这个解决办法,因为我再添映射的实体,即包装企业指的是在数据库中,这意味着另一个表另加入每个查询等...

所以我的两个问题是:

  1. 从设计的角度来看,是一个实用程序类坚持这个Map接受吗?
  2. 假设我们这样映射模型,我该如何改进映射?
+0

Map 属于哪个实体? – 2011-03-11 19:54:25

+0

@JB Nizet,它自己的实体,它应该是一个类似单实体的实体(即只有一个实例,该实例拥有该映射)。诚然不漂亮。 – davin 2011-03-11 19:57:44

回答

1

我最终作出了新的实体@ManyToMany映射的复合材料部件,是这样的:

@Entity 
public class POJOWithComposites extends Model { 

    @ManyToMany 
    CompositeType compositePtr; 

    @ManyToMany 
    CompositeOtherType compositeOtherPtr; 

    ... 
} 

这样,我确实离开了复杂的这个元素了我的用户模型,因为它不是一部分的核心用户实体,并允许有效的映射(外键)。

2

创建单例实体没有意义。您应该简单地映射User和POJOWithComposite之间的一对多关联。

获取用户(使用session.get())并致电user.getPOJOWithComposites()获取给定用户的所有POJOWithComposites。如果您希望针对多个用户使用它们,请使用HQL查找这些用户,并遍历找到的用户并导航到关联中。单例映射是休眠会话。使用它的方法来查询数据库。