是否可以使用列作为哈希映射的键来创建一对一映射?

时间:2019-04-25 15:56:37

标签: java hibernate orm hibernate-mapping hibernate-5.x

想象一下我有下面的类,其中所有字段都是整数:

@Entity
public class Bar implements Serializable { 
    @Id
    private Integer id;

    @Basic
    private Integer field1;

    @Basic
    private Integer field2;

    //Constructor & getters/setters omitted
}

现在,我希望拥有另一个类Foo,该类具有HashMap,其中的键是Bar中的字段,并带有相应的值。也就是说,像这样的东西:

@Entity
public class Foo implements Serializable {
   @Id
   private Integer id;

   @Basic
   private String someString;

   @Basic
   private Integer someInteger;

   @??
   private HashMap<String, Integer> barMap;

   //Constructor & getters/setters omitted

这样做的原因是我有一个底层的Enum,该Enum的每个值都应该是一列,然后将其作为Map提取后,我将可以轻松访问每个字段,因为我已经知道属性。

在我看来,基础表如下所示: Link to image, as I am not allowed to embed yet.

像这样可能吗?需要什么样的注释?我以前在Foo中尝试过以下方法,但是它报告不应将“一对一”属性用作地图,因此我可能在考虑这种错误方法。

@OneToOne(mappedBy="Bar")
@MapKey(name="Id")
private HashMap<String, Integer> barMap;

1 个答案:

答案 0 :(得分:0)

致以后的访客:

我找不到任何方法可以实现这一目标,我意识到这可能是因为它不是好的设计/实践。相反,我最终重新设计了Bar类,以使它的字段现在是枚举和值,基本上是对表进行了转置。这样,Foo类将仅具有一个Map<Enum, Bar>。注释是:

Foo

@OneToMany(mappedBy="fooInstance", cascade = CascadeType.ALL)
@MapKey(name="enumField")
private Map<EnumType, Bar> barMap;

栏:

@Id
@Column(name = "id", unique = true, nullable = false)
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Integer id;

@Column(name="enumField", nullable = false)
@Enumerated(EnumType.ORDINAL)
private EnumType enumField;

@Basic
@Column(name="myField")
private int myField = 0;

@ManyToOne
@JoinColumn(name="fooInstance", nullable = false)
private Foo fooInstance;