Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.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
Jpa 以枚举为键、对象列表为值持久化映射_Jpa - Fatal编程技术网

Jpa 以枚举为键、对象列表为值持久化映射

Jpa 以枚举为键、对象列表为值持久化映射,jpa,Jpa,我正在努力坚持地图。首先是我的数据库设计: 我有一个侧面装载机,最多可以有5个不同的集装箱。ContainerSize定义为枚举。对于每个容器化,都有多个缩放条目。所以这是一个1:5:n的关系 目前,我用以下实体来表示此设计: @Entity @Table(name = "sideloader") public class SideloaderEntity { @Id @GeneratedValue @Column(name = "id") private Lo

我正在努力坚持地图。首先是我的数据库设计: 我有一个侧面装载机,最多可以有5个不同的集装箱。ContainerSize定义为枚举。对于每个容器化,都有多个缩放条目。所以这是一个1:5:n的关系

目前,我用以下实体来表示此设计:

@Entity
@Table(name = "sideloader")
public class SideloaderEntity {

    @Id
    @GeneratedValue
    @Column(name = "id")
    private Long id;

    @Column(name = "currency")
    private Currency currency;

    // TODO
    private Map<ContainerSize, SideloaderContainersizeEntity> scalesPerContainerSize;

@Entity
@Table(name = "sideloader_containersize")
public class SideloaderContainersizeEntity {

    @Id
    @GeneratedValue
    @Column(name = "id")
    private Long id;

    //TODO
    private List<SideloaderScaleEntity> scales;

@Entity
@Table(name = "sideloader_containersize_scale")
public class SideloaderScaleEntity {

    @Id
    @GeneratedValue
    @Column(name = "id")
    private Long scaleId;

    @Column(name = "upper_bound_distance_km")
    private int upperBoundDistanceKm;

    ...
@实体
@表(name=“sideloader”)
公共类侧载属性{
@身份证
@生成值
@列(name=“id”)
私人长id;
@列(name=“currency”)
私人货币;
//待办事项
私有地图缩放内容化;
@实体
@表(name=“sideloader\u containersize”)
公共类SideLoaderContainerUserizeEntity{
@身份证
@生成值
@列(name=“id”)
私人长id;
//待办事项
私人名册;
@实体
@表(name=“sideloader\u containersize\u scale”)
公共类SideloaderScaleEntity{
@身份证
@生成值
@列(name=“id”)
私人长鳞片;
@列(name=“上限距离公里”)
专用int上限距离km;
...
现在,我被卡住了。我甚至不确定是否可以将此映射到现有的数据库布局。我也不知道需要确切使用哪些注释。我已经阅读了一些关于“如何持久化映射”的文章,但这些文章总是在描述没有现有数据库布局的映射


你能帮帮我吗?

我会尝试通过三个步骤来达到你的效果:

  • 尝试使用
    列表映射
    SideloaderContainersizeEntity
    SideloaderContainersizeEntity
    之间的关系,暂时跳过
    SideloaderContainersizeEntity
    SideloaderScaleEntity
    之间的关系。要实现这一点,完全可以替换
    private Map scalesPerContainerSize;
    @OneToMany(mappedBy=“sideloaderEntity”)私有列表sideLoaderContainerEntities;
    其中
    sideloaderEntity
    是您的
    sideLoaderContainerEntity
    @manytone-private-sideloaderEntity-sideloaderEntity
    字段
  • 尝试将
    列表
    替换为
    映射
    :将
    私有列表侧装载器容器实体;
    替换为
    @MapKey(name=“containerSize”)私有地图缩放容器化;
    其中
    containerSize
    SideloaderContainersizeEntity的
    private containerSize containerSize
    字段
  • SideloaderContainersizeEntity
    SideloaderScaleEntity
    之间的关系添加为
    列表

  • 在同事和@Smutje的帖子的帮助下,我想出了以下解决方案:

    @Entity
    @Table(name = "sideloader")
    public class SideloaderEntity {
    
        @Column(name = "currency")
        private Currency currency;
    
        @OneToMany(cascade = CascadeType.PERSIST)
        @JoinColumn(name = "sideloader_id", referencedColumnName = "id")
        @MapKey(name = "containerSize")
        private Map<ContainerSize, SideloaderContainersizeEntity> scalesPerContainerSize;
    
    @Entity
    @Table(name = "sideloader_containersize")
    public class SideloaderContainersizeEntity {
    
        @Id
        @GeneratedValue
        @Column(name = "id")
        private Long id;
    
        @Enumerated(EnumType.STRING)
        @Column(name = "container_size")
        private ContainerSize containerSize;
    
        @OneToMany(cascade = CascadeType.PERSIST)
        @JoinColumn(name = "sideloader_containersize_id", referencedColumnName = "id")
        private List<SideloaderScaleEntity> scales;
    
    @Entity
    @Table(name = "sideloader_containersize_scale")
    public class SideloaderScaleEntity {
    
        @Id
        @GeneratedValue
        @Column(name = "id")
        private Long scaleId;
    
        @Column(name = "upper_bound_distance_km")
        private int upperBoundDistanceKm;
    
        ...
    
    @Test
    void foo() {
    
        SideloaderPriceComponent sideloader = new SideloaderPriceComponent();
    
        SideloaderScaleEntity scale = new SideloaderScaleEntity();
        scale.setUpperBoundDistanceKm(10);
    
        SideloaderContainersizeEntity containersize = new SideloaderContainersizeEntity();
        containersize.setContainerSize(ContainerSize.FORTY);
        containersize.setScales(Collections.singletonList(scale));
    
        sideloader.setScalesPerContainerSize(Collections.singletonMap(ContainerSize.FORTY, containersize));
    
        em.persist(sideloader);
        em.flush();
    }