Предотвратить каскадную вставку JPA - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть два класса:

public class Order{

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  Long id;

  @ManyToOne(fetch = FetchType.LAZY)
  Status status;

}

public class Status{

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  Long id;

  String description;

}

Когда я вызываю Spring в JPARepository для сохранения ордера, jpa пытается сохранить сохранить новую строку статуса, но на самом деле я хочу только сохранить отношения между ордером иСтатус.Моя таблица состояния никогда не должна меняться.Как я могу предотвратить вторую вставку в таблицу «Status»?

Исключение:

"org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing

Таблица «Order» имеет идентификатор (PK), StatusId (FK) Таблица «Status» имеет идентификатор(PK), описание

Ответы [ 3 ]

0 голосов
/ 04 декабря 2018

Если у статуса может быть несколько заказов, вы должны переместить элемент управления ассоциацией в класс статуса и иметь список заказов с аннотацией oneToMany.Кроме того, предпочтительно, чтобы вы использовали двунаправленные ассоциации вместо однонаправленных.Подводя итог, в вашем случае правильное отображение будет выглядеть так:

public class Order{

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  Long id;

  @ManyToOne(fetch = FetchType.LAZY)
  Status status;
}


public class Status{

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    Long id;

    String description;

    @OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL, mappedBy="status")
    List<Order> orders;
}
0 голосов
/ 04 декабря 2018

Вы можете указать операции для каскадирования в реляционной аннотации, см. cascade () , например

@ManyToOne(fetch=..., cascade={CascadeType.DETACH,CascadeType.REFRESH})

Обратите внимание, что мы указываем , который операций для каскадирования, что подразумевает , а не каскадирование других операций.

0 голосов
/ 03 декабря 2018

Это очень базовая концепция.Поскольку вы используете @GeneratedValue, он будет генерировать новый идентификатор каждый раз, когда вы сохраняете и создаете новую строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...