Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA映射实体图_Java_Hibernate_Jpa_Map - Fatal编程技术网

Java JPA映射实体图

Java JPA映射实体图,java,hibernate,jpa,map,Java,Hibernate,Jpa,Map,从昨天开始,我提出了一个非常流行的问题: 我试图绘制一个基本上如下所示的结构: Map<User, List< POJOWithComposite >> @Entity public class User extends Model { public String username; public String password; ... } 而POJOWithComposite是另一个实体,它有一些映射实体和一些原语,类似于: @Entity p

从昨天开始,我提出了一个非常流行的问题:

我试图绘制一个基本上如下所示的结构:

Map<User, List< POJOWithComposite >>
@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;
   ...
}
这种结构可以类似于购物车。因此,
用户
持有账户信息,
OtherModel
可以是可购买的商品,
POJOWithComposite
是一个购物车,可以存放商品和数量。当涉及到主要对象时,我的类比有点不成立,但请幽默我,让我们假设在每次会话中,我们都会将用户付费的购物车添加到列表中,然后将其存档,比如说

首先,如果列表属于每个用户,我可以将其添加到
用户
模型中,尽管我觉得这不是非常模块化的(即信息不是真正的用户帐户信息)。自动取款机,这张地图位于一个类似实用工具的购物类,它负责将购物车与购物者匹配,以避免我把
用户
模型弄得太大。(这里有更好的模式吗?)

假设我继续沿着这条路走下去,让我们尝试绘制这张地图。理想情况下,我希望能够按原样绘制地图。虽然我在这方面运气不好

我偶然遇到一些关于映射
ArrayList
的讨论,因为它是可序列化的,尽管在这里没有实现

所以我制作了一个包装器实体:

@Entity
public class POJOWithCompositeList extends Model {
   @OneToMany
   List<POJOWithComposite> list = new ArrayList<POJOWithComposite>();
}
@实体
公共类POJOWithCompositeList扩展模型{
@独身癖
列表=新的ArrayList();
}
这很有效。当我像这样使用此实体时,我可以映射我的新实体:

@ManyToMany
Map<User, POJOWithCompositeList>
@manytomy
地图
虽然我不太喜欢这个解决方案,因为我添加了另一个映射实体,即包装实体意味着数据库中的另一个表,这意味着每个查询都有一个连接,等等

所以我的两个问题是:

  • 从设计角度来看,将此
    映射粘贴到util类中是否可以接受
  • 假设我们这样映射模型,我如何改进映射

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


    获取一个用户(使用
    session.Get()
    )并调用
    User.getPOJOWithComposites()
    获取给定用户的所有POJOWithComposites。如果希望多个用户使用它们,那么使用HQL查找这些用户,并遍历找到的用户并导航到关联。单例映射是hibernate会话。使用它的方法来查询数据库。

    我最终创建了一个新实体,在复合零件上有许多映射,比如:

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

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

    映射属于哪个实体?@JB niset,它自己的实体,应该是一个单例实体(即,只有一个实例,该实例持有映射)。无可否认,这并不漂亮。