【问题标题】:JPA Mapping a Map of EntitiesJPA 映射实体映射
【发布时间】:2011-07-13 17:56:10
【问题描述】:

从我昨天的热门问题中解脱出来:

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 粘贴在 util 类中是否可以接受?
  2. 假设我们像这样映射模型,我该如何改进映射?

【问题讨论】:

  • Map>属于哪个实体?
  • @JB Nizet,它自己的实体,它应该是一个类似单例的实体(即只有一个实例并且该实例持有地图)。诚然不漂亮。

标签: java hibernate jpa map


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我最终在复合部件上使用@ManyToMany 映射创建了一个新实体,例如:

    @Entity
    public class POJOWithComposites extends Model {
    
       @ManyToMany
       CompositeType compositePtr;
    
       @ManyToMany
       CompositeOtherType compositeOtherPtr;
    
       ...
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-13
      • 2011-10-20
      • 2020-03-21
      • 2011-07-25
      • 2015-08-02
      • 1970-01-01
      • 1970-01-01
      • 2011-02-14
      相关资源
      最近更新 更多