Как игнорировать обновление или вставить объединение, если значение NULL - PullRequest
0 голосов
/ 12 мая 2019

У меня есть объектный компонент с отношением @ManyToOne, который находится в соединении на одном столбце.

@Entity
@Table(name = "work_order")
public class WorkOrder implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
@SequenceGenerator(name = "sequenceGenerator")
private Long id;

@NotNull
@Column(name = "id_order", nullable = false)
private String idOrder;

@Column(name = "description")
private String description;

@Enumerated(EnumType.STRING)
@Column(name = "status")
private StatusOrder status;

@Column(name = "creation_date")
private Instant creationDate;

@Column(name = "closing_date")
private Instant closingDate;

@Column(name = "client_id")
private Long clientId;

@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST) @NotFound (action = NotFoundAction.IGNORE)
@Fetch(FetchMode.JOIN)
@JoinColumn(name = "account",  insertable = false, updatable = false, nullable = true)
private AnagraficaClienti account;

И вторая сущность

@Entity
@Table(name = "es_account")
public class AnagraficaClienti implements Serializable {

private static final long serialVersionUID = 1L;


// da rimettere a @NotNull 
@Column(name = "fk_cod_azienda", nullable = true)
private String fk_cod_azienda;
@Id
@NotNull
@Column(name = "account", nullable = false)
private String account;
// da rimettere a @NotNull
@Column(name = "tipo_cli_for", nullable = true)
private String tipoClienteFornitore;

@Column(name = "tipo_account", nullable = true)
private String tipoAccount;
....

Таблица "es_account" имеет три первичных ключа, которые не могут иметь значение NULL (fk_cod_azienda, account, tipo_cli_for), и связь с таблицей "work_order" определяется столбцом учетной записи.

Моя проблема в том, что иногда возможно, что пользователь вставляет или обновляет WorkOrder с нулевым значением учетной записи, и это не исключается сущностью AnagraficaClienti, поскольку она ожидает ненулевое (и не дублирующееся) значение.

Есть ли какой-нибудь возможный способ обойти объединение с AnagraficaClienti, когда учетная запись пуста?

1 Ответ

0 голосов
/ 12 мая 2019

На мой взгляд, @ManyToOne нарушает принцип проектирования ООП из-за создания избыточных отношений. Вместо этого я всегда создаю отношение @OneToMany со списком связанных объектов. Чтобы указать отношение как обнуляемое, просто добавьте свойство nullable = true в @JoinColumn. С @ManyToOne вы должны указать свойство необязательно = true . Попробуем проверить, работает ли он.

WorkOrder

@Entity
@Table(name = "work_order")
public class WorkOrder implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
@SequenceGenerator(name = "sequenceGenerator")
private Long id;

@NotNull
@Column(name = "id_order", nullable = false)
private String idOrder;

@Column(name = "description")
private String description;

@Enumerated(EnumType.STRING)
@Column(name = "status")
private StatusOrder status;

@Column(name = "creation_date")
private Instant creationDate;

@Column(name = "closing_date")
private Instant closingDate;

@Column(name = "client_id")
private Long clientId;

AnagraficaClienti

@Entity
@Table(name = "es_account")
public class AnagraficaClienti implements Serializable {

private static final long serialVersionUID = 1L;


// da rimettere a @NotNull 
@Column(name = "fk_cod_azienda", nullable = true)
private String fk_cod_azienda;
@Id
@NotNull
@Column(name = "account", nullable = false)
private String account;
// da rimettere a @NotNull
@Column(name = "tipo_cli_for", nullable = true)
private String tipoClienteFornitore;

@Column(name = "tipo_account", nullable = true)
private String tipoAccount;

@OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
@JoinColumn(name = "account", nullable = true)
private List<WorkOrder> workOrders;

Если вы хотите вставить рабочее задание в базу данных:

workOrderRepository.save(workOrder);

Когда вы хотите создать отношения:

AnagraficaClienti client = anagraficaClientiRepository.findById(...);
client.getWorkOrders().add(newWorkOrder);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...