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