Я создал простой сервис CRUD. С 4 юридическими лицами: Клиент, Поставщик, Продукт, Сделка.
Объекты
Customer
и Provider
имеют идентификатор AppId
со следующей структурой:
@Getter
@Setter
@Embeddable
@NoArgsConstructor
public class AppId implements Serializable {
private String app;
private String id;
//...
}
Вот бизнес-логика, которую я хочу:
Сущности провайдеров каскадируются и создаются сущности продукта.
Когда клиент заключает сделку с провайдером, мне нужно создать сущность Deal
, которая не каскадирует никакие другие сущности.
В нем есть поля, которые относятся к поставщику, клиенту и продукту сделки.
Я создал несколько провайдеров и клиентов.
Тогда я попытался заключить сделку, но я получил поля клиента и поставщика null
.
Вот мои определения сущностей:
Provider
@Entity
@Getter
@Setter
@ToString
@NoArgsConstructor
@Table(name = "provider")
public class Provider implements Serializable {
@EmbeddedId
@Column(name = "appid")
private AppId appId;
@Column(name = "name")
private String name;
@Column(name = "firstname")
private String firstName;
@Column(name = "lastname")
private String lastName;
@Column(name = "latitude")
private float latitude;
@Column(name = "longitude")
private float longitude;
@Column(name = "work_date")
private Date workDate;
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "provider_product"
, joinColumns = {
@JoinColumn(name = "provider_app"),
@JoinColumn(name = "provider_id")
}
, inverseJoinColumns = @JoinColumn(name="product_id"))
private Set<Product> products;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumns({
@JoinColumn(name = "app", referencedColumnName = "app", updatable = false, insertable = false),
@JoinColumn(name = "id", referencedColumnName = "id", updatable = false, insertable = false)
})
private List<Deal> dealList = new ArrayList<>();
}
Customer
@Entity
@Getter
@Setter
@ToString
@NoArgsConstructor
@Table(name = "customer")
public class Customer implements Serializable {
@EmbeddedId
@Column(name = "appid")
private AppId appId;
@Column(name = "firstname")
private String firstName;
@Column(name = "lastname")
private String lastName;
public Customer(AppId appId, String firstName, String lastName) {
this.appId = appId;
this.firstName = firstName;
this.lastName = lastName;
}
}
Product
:
@Entity
@Getter
@Setter
@ToString
@NoArgsConstructor
@Table(name = "product")
public class Product implements Serializable {
@Id
@GeneratedValue
private long id;
@Column(name = "name")
private String name;
@Column(name = "cost")
private long cost;
}
Deal
@Entity
@Getter
@Setter
@ToString
@NoArgsConstructor
@Table(name = "deal")
public class Deal implements Serializable {
@Id
@GeneratedValue
private long id;
@ManyToOne
@JoinColumns({
@JoinColumn(name = "provider_app", referencedColumnName = "app", insertable = false, updatable = false),
@JoinColumn(name = "provider_id", referencedColumnName = "id", insertable = false, updatable = false)
})
private Provider provider;
@ManyToOne
@JoinColumns({
@JoinColumn(name = "customer_app", insertable = false, updatable = false),
@JoinColumn(name = "customer_id", insertable = false, updatable = false)
})
private Customer customer;
@ManyToMany
@JoinTable(name = "deal_product"
, joinColumns = @JoinColumn(name="deal_id", insertable = false, updatable = false)
, inverseJoinColumns = @JoinColumn(name="product_id", insertable = false, updatable = false))
private Set<Product> product;
// deal is complete when provider entered deal id
@Column(name = "closed")
private boolean closed = false;
}