是否可以使用列作为散列图的键来创建一对一映射?
Is it possible to create a one-to-one mapping with the columns as keys for a hashmap?
假设我有以下 class,其中所有字段都是整数:
@Entity
public class Bar implements Serializable {
@Id
private Integer id;
@Basic
private Integer field1;
@Basic
private Integer field2;
//Constructor & getters/setters omitted
}
现在我希望有另一个 class 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
这样做的原因是我有一个底层枚举,枚举的每个值都应该是一个列,然后在将其作为 Map 获取之后我可以轻松访问每个字段,因为我已经知道属性名称。
在我看来,基础表看起来像这样:
Link to image, as I am not allowed to embed yet.
这样的事情可能吗?它需要什么样的注释?我之前在 Foo
中尝试过如下操作,但它报告说不应将一对一属性用作映射,所以我可能以错误的方式思考这个问题。
@OneToOne(mappedBy="Bar")
@MapKey(name="Id")
private HashMap<String, Integer> barMap;
致所有未来的访客:
我找不到任何方法来解决这个问题,我意识到这可能是因为它不好 design/practice。相反,我最终重新设计了我的 Bar
class 以便它的字段现在是枚举和值,基本上是转置 table。 Foo
class 然后只是有一个 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;
假设我有以下 class,其中所有字段都是整数:
@Entity
public class Bar implements Serializable {
@Id
private Integer id;
@Basic
private Integer field1;
@Basic
private Integer field2;
//Constructor & getters/setters omitted
}
现在我希望有另一个 class 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
这样做的原因是我有一个底层枚举,枚举的每个值都应该是一个列,然后在将其作为 Map 获取之后我可以轻松访问每个字段,因为我已经知道属性名称。
在我看来,基础表看起来像这样: Link to image, as I am not allowed to embed yet.
这样的事情可能吗?它需要什么样的注释?我之前在 Foo
中尝试过如下操作,但它报告说不应将一对一属性用作映射,所以我可能以错误的方式思考这个问题。
@OneToOne(mappedBy="Bar")
@MapKey(name="Id")
private HashMap<String, Integer> barMap;
致所有未来的访客:
我找不到任何方法来解决这个问题,我意识到这可能是因为它不好 design/practice。相反,我最终重新设计了我的 Bar
class 以便它的字段现在是枚举和值,基本上是转置 table。 Foo
class 然后只是有一个 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;