Как разрешить дубликаты в arrayList при использовании JPA? - PullRequest
0 голосов
/ 05 апреля 2020

Я получаю «java .lang.IllegalStateException: множественные представления одной и той же сущности», даже если для @Id установлено значение true, и я использую отношение «один ко многим» в моей переменной.

Вот классы, которые я пытаюсь связать друг с другом:

@Entity
@Table(name = "map_area")
public class MapArea extends BasicModel {
   @Id
   @Column(nullable = false, unique = true)
   private String name;

   @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
   @JoinColumn(name = "area", referencedColumnName = "name")
   public List<AlternativeAreaName> alternativeNames;

    public MapArea() {}

    public MapArea(String name) {
        this.name = name;
        this.alternativeNames = new ArrayList<>();
    }

}
@Entity
@Table(name = "alternative_area_name")
public class AlternativeAreaName implements Serializable {

    @Id
    @Column(nullable = false, unique = false)
    private String area;

    @Column(nullable = true)
    private String alternativeName;

    public AlternativeAreaName(){}

    public AlternativeAreaName(String area, String alternativeName) {
        this.area = area;
        this.alternativeName = alternativeName;
    }

}

Я хочу, чтобы JPA создала другую таблицу, которая относится к этому простому на основе Переменная name, но всякий раз, когда я пытаюсь добавить ее в список и сохранить в БД, я получаю

java .lang.IllegalStateException: несколько представлений одного и того же объекта

MapArea mapArea = new MapArea("example");
AlternativeAreaName altAreaName1 = new AlternativeAreaName("example", "alt example");
AlternativeAreaName altAreaName2 = new AlternativeAreaName("example", "alt example2");
mapArea.alternativeNames.add(altAreaName2);

mapAreaRepository.save(mapArea);

1 Ответ

0 голосов
/ 05 апреля 2020

Вы использовали поле private String area в качестве первичного ключа для объекта AlternativeAreaName. Поэтому, когда вы пытаетесь добавить

AlternativeAreaName altAreaName1 = new AlternativeAreaName("example", "alt example");
AlternativeAreaName altAreaName2 = new AlternativeAreaName("example", "alt example2");

Оба они имеют один и тот же первичный ключ. Таким образом, он вызывает вышеприведенное исключение.

Чтобы сгенерировать первичный ключ для сущности JPA, установите флажок

...