繁体   English   中英

JPA映射实体图

[英]JPA Mapping a Map of Entities

从昨天开始我广受欢迎的问题:

Hibernate(JPA)映射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. 假设我们确实像这样映射模型,如何改善映射?

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

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

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

@Entity
public class POJOWithComposites extends Model {

   @ManyToMany
   CompositeType compositePtr;

   @ManyToMany
   CompositeOtherType compositeOtherPtr;

   ...
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM