JPA映射一个地图实体
度过了我的方式太热门从昨天的问题: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>
虽然我真的不喜欢这个解决办法,因为我再添映射的实体,即包装企业指的是在数据库中,这意味着另一个表另加入每个查询等...
所以我的两个问题是:
- 从设计的角度来看,是一个实用程序类坚持这个
Map
接受吗? - 假设我们这样映射模型,我该如何改进映射?
我最终作出了新的实体@ManyToMany
映射的复合材料部件,是这样的:
@Entity
public class POJOWithComposites extends Model {
@ManyToMany
CompositeType compositePtr;
@ManyToMany
CompositeOtherType compositeOtherPtr;
...
}
这样,我确实离开了复杂的这个元素了我的用户模型,因为它不是一部分的核心用户实体,并允许有效的映射(外键)。
创建单例实体没有意义。您应该简单地映射User和POJOWithComposite之间的一对多关联。
获取用户(使用session.get()
)并致电user.getPOJOWithComposites()
获取给定用户的所有POJOWithComposites。如果您希望针对多个用户使用它们,请使用HQL查找这些用户,并遍历找到的用户并导航到关联中。单例映射是休眠会话。使用它的方法来查询数据库。
Map属于哪个实体? –
2011-03-11 19:54:25
@JB Nizet,它自己的实体,它应该是一个类似单实体的实体(即只有一个实例,该实例拥有该映射)。诚然不漂亮。 – davin 2011-03-11 19:57:44