想象一下我有下面的类,其中所有字段都是整数:
@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;
答案 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;