JPA映射实体地图

时间:2011-03-11 19:38:32

标签: java hibernate jpa map

从昨天开始我的方式 - 太受欢迎的问题:

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>

虽然我不太喜欢这个解决方案,因为我添加了另一个映射实体,即包装实体意味着数据库中的另一个表,这意味着另一个连接每个查询等......

所以我的两个问题是:

  1. 从设计的角度来看,这个Map是否可以接受?{/ li>
  2. 假设我们确实映射了这样的模型,我该如何改进映射?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

我最终在复合部件上创建了一个带有@ManyToMany映射的新实体,类似于:

@Entity
public class POJOWithComposites extends Model {

   @ManyToMany
   CompositeType compositePtr;

   @ManyToMany
   CompositeOtherType compositeOtherPtr;

   ...
}

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