CustomerProductCompound
, так как вы определили только первичный ключ ProductWiseCustomer
.Ваши коллекции внутри CustomerInfo
и Product
должны содержать ProductWiseCustomer
элементов, а не их ключ.
@Entity
@Table(name = "product")
public class Product {
@Id
private Long productId;
private String productName;
private Decimal productPrice;
@OneToMany(mappedBy = "product", cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
private Set<ProductWiseCustomer> productWiseCustomers;
}
@Entity
@Table(name = "customerinfo")
public class CustomerInfo {
@Id
private Long customerId;
private String customerName;
private Boolean isActive;
@OneToMany(mappedBy = "customer", cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
private Set<ProductWiseCustomer> productWiseCustomers;
}
Обратите внимание, что в аннотации добавлено свойство mappedBy
.Необходимо указать имя свойства на той стороне, которая ссылается на этот объект.Имя JPA, а не имя SQL.targetEntity
редко требуется, и я предложил orphanRemoval
, так что если вы удалите один из набора, вам не нужно будет удалять его вручную, чтобы он исчез.
Что касаетсяProductWiseCustomer
, вам нужен тот же ключ, который показан модульным кодером
@Embeddable
public class ProductCustomerKey {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "customerId)
private Customer customer;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "productId")
private Product product;
}
Но я рекомендую использовать @IdClass
вместо @EmbeddedId
@Entity
@IdClass(ProductCustomerKey.class)
public class ProductWiseCustomer {
@ManyToOne(fetch = FetchType.LAZY) // should be lazy here
@JoinColumn(name = "customerId)
private Customer customer;
@ManyToOne(fetch = FetchType.LAZY) // should be lazy here
@JoinColumn(name = "productId")
private Product product;
private OffsetDateTime createDate;
private String remarks;
// getters, setters
}