从昨天开始我的问题太受欢迎了:
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模型中,尽管我觉得这不是非常模块化的(即信息实际上不是用户帐户信息)。ATM,这张地图位于一个类似于实用工具的购物类中,它负责把购物车和购物者匹配起来,这样我就不会让User模型太大了。(这里是否有更好的模式可供使用?)
假设我继续沿着这条路走下去,让我们试着映射这个Map。理想情况下,我希望能够按原样绘制地图。虽然我在这方面运气很差。
我偶然看到一些关于映射ArrayList的讨论,因为它是Serializable,尽管在这里没有实现它。
所以我制作了一个包装实体:
@Entity
public class POJOWithCompositeList extends Model {
@OneToMany
List<POJOWithComposite> list = new ArrayList<POJOWithComposite>();
}这个很管用。当我像这样使用这个实体时,我可以映射我的新的:
@ManyToMany
Map<User, POJOWithCompositeList>虽然我不太喜欢这个解决方案,因为我添加了另一个映射实体,即包装实体意味着数据库中的另一个表,这意味着另一个连接,每个查询等等。
所以我的两个问题是:
从设计的角度来看,acceptable?
发布于 2011-03-16 16:47:07
最后,我在复合部件上创建了一个具有@ManyToMany映射的新实体,如下所示:
@Entity
public class POJOWithComposites extends Model {
@ManyToMany
CompositeType compositePtr;
@ManyToMany
CompositeOtherType compositeOtherPtr;
...
}这样,我确实把这个复杂性元素从我的用户模型中去掉了,因为它不是核心用户实体的一部分,并且允许高效的映射(外键)。
发布于 2011-03-11 20:20:07
创建单例实体是没有意义的。您应该简单地映射用户和POJOWithComposite之间的一对多关联。
获取一个用户(使用session.get())并调用user.getPOJOWithComposites()获取给定用户的所有POJOWithComposites。如果您想要几个用户,那么使用HQL查找这些用户,并遍历找到的用户并导航到关联中。单例映射是hibernate会话。使用其方法查询数据库。
https://stackoverflow.com/questions/5277522
复制相似问题