При разработке приложения корзины покупок ниже приведены мои классы сущностей ....
Когда я сохраняю его впервые, сущность пользователя сохраняется должным образом, когда используется тот же запрос, чтобы снова сохранить пользователя, а затем ранее сохраненный иностранный ключ становится пустым, я использую один и тот же запрос, потому что для одного и того же пользователя для одной и той же корзины продукты корзины должны обновляться в несколько строк.
@Entity
public class CartProduct implements Serializable {
/**
* serialVersionUID.
*/
private static final long serialVersionUID = 5846027470952949766L;
/**
* cartProdcutId.
*/
@Id
@GeneratedValue
@Column(name = "CART_PRODUCT_ID")
private Integer cartProdcutId;
/**
* product.
*/
@ManyToOne
@JoinColumn(name = "PRODUCT_ID")
private Product product;
/**
* cart.
*/
@ManyToOne
@JoinColumn(name = "CART_ID")
private Cart cart;
/**
* quantity.
*/
@Min(value = 0, message = "Product Quantity should not be negative")
@Column(name = "QUANTITY")
private Integer quantity;
}
второй класс
@Entity
public class Cart {
/**
* cartId.
*/
@Id
@GeneratedValue
@Column(name = "CART_ID")
Integer cartId;
/**
* cartProducts.
*/
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "CART_ID")
Set<CartProduct> cartProducts = new HashSet<CartProduct>();
}
Сохранение пользователя класс
@Entity
public class User {
/**
* userId.
*/
@Id
@GeneratedValue
@Column(name = "USER_ID")
Integer userId;
/**
* userName.
*/
@Column(name = "USER_NAME")
String userName;
/**
* cart.
*/
@OneToOne(cascade = CascadeType.ALL)
Cart cart;
}
Класс продукта
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@NamedQueries({ @NamedQuery(name = "Product.findBook", query = "SELECT p FROM Product p WHERE TYPE(p) = Book"),
@NamedQuery(name = "Product.findApparal", query = "SELECT p FROM Product p WHERE TYPE(p) = Apparal"),
@NamedQuery(name = "Product.findByName", query = "SELECT p FROM Product p WHERE p.productName=:name") })
public class Product {
/**
* productId.
*/
@Id
@GeneratedValue
@Column(name = "PRODUCT_ID")
Integer productId;
/**
* productName.
*/
@Column(name = "PRODUCT_NAME")
String productName;
/**
* price.
*/
@Column(name = "PRICE")
Float price;
}
Сервисный метод для сохранения пользователя
userRepository.save(user);
Json используется в почтальоне для сохранения сущности пользователя:
{
"cart": {
"cartId": 1,
"products": [
{
"cartProdcutId": 1,
"product": {
"price": 100,
"productId": 1,
"productName": "ProdNameOne"
},
"quantity": 1
}
]
},
"userId": 1,
"userName": "USERONE"
}
Ниже приведен снимок экрана с базой данных, в котором значение NULL обновлено в первой строке: Снимок экрана с базой данных