Можно ли создать взаимно-однозначное сопоставление со столбцами в качестве ключей для хэш-карты? - PullRequest
0 голосов
/ 25 апреля 2019

Представьте, что у меня есть следующий класс, где все поля являются целыми числами:

@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, я получу легкий доступ к каждому полю, потому что я уже знаю имена свойства.

По-моему, базовые таблицы будут выглядеть примерно так: Ссылка на изображение, так как я пока не могу вставлять.

Возможно ли что-то подобное? Какие аннотации это потребует? Ранее я пытался что-то сделать следующим образом в Foo, но он сообщает, что атрибут One-To-One не должен использоваться в качестве карты, поэтому я, вероятно, думаю об этом неправильно.

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

1 Ответ

0 голосов
/ 25 апреля 2019

Для любых будущих посетителей:

Я не мог найти способ осуществить это, и я понял, что это, вероятно, потому что это не очень хороший дизайн / практика. Вместо этого я закончил редизайн моего класса 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;
...