org.hibernate.PersistentObjectException:传递给持久化的分离实体:com.xptraining.model.Representative
org.hibernate.PersistentObjectException: detached entity passed to persist: com.xptraining.model.Representative
错误
Caused by: org.hibernate.PersistentObjectException: detached entity passed to persist: com.xptraining.model.Representative
推车控制器class
@POST
@Path(XpConstants.PLACE_ORDER)
@Consumes("application/json")
@Produces("application/json")
public Status placeOrder1(Carts carts) {
Representative r2 = carts.getRepresentative();
List<Sku> sList = carts.getListSku();
CartsOrderDto cartOrderDto = new CartsOrderDto();
Sku s = new Sku();
try {
cartOrderDto.setCartId(carts.getCartId());
cartOrderDto.setTotalBill(carts.getPrize());
cartOrderDto.setProductList(carts.getListSku());
cartOrderDto.setRepresentative(carts.getRepresentative());
Carts c = new Carts();
c.setCartId(carts.getCartId());
cartServices.deleteCart(carts.getCartId());
for (Sku sku : sList) {
s.setPrize(sku.getPrize());
s.setProduct(sku.getProduct());
s.setQuanity(sku.getQuanity());
s.setSize(sku.getSize());
s.setSkuId(sku.getSkuId());
s.setSkuName(sku.getSkuName());
s.setUnitName(sku.getUnitName());
skuServices.addSku(s);
}
Orders orders = new Orders();
orders.setCurrentDate(Utilities.getTodaysDate());
orders.setStatus("Active");
orders.setRepresentative(r2);
orders.setListSku(sList);
representativeServices.addRepresentative(r2);
orderServices.saveOrders(orders);
logger.info("Record saved in order and deleted from cart sucessfully");
return new Status(1, XpConstants.RECORD_SAVED);
} catch (Exception e) {
logger.error(XpConstants.ERROR_OCCURED, e);
}
return new Status(1, XpConstants.PLACED_WRONG_ID);
}
实体class是:
Cart.java
@Entity
@Table(name = "carts")
public class Carts {
@Id
@Column(name = CARTS_ID)
private long cartId;
@Column(name = PRIZE)
private int prize;
@ElementCollection(targetClass=Product.class)
@OneToMany(cascade = CascadeType.ALL , fetch=FetchType.EAGER )
@JoinTable(
name = "CARTS_SKU",
joinColumns = { @JoinColumn(name = CARTS_ID) },
inverseJoinColumns = { @JoinColumn(name = SKU_ID) }
)
private List<Sku> listSku;
@OneToOne(cascade=CascadeType.ALL ,fetch=FetchType.EAGER)
@JoinColumn(name=REPRESENTATIVE_ID)
private Representative representative;
}
Orders.java
@Entity
@Table(name = Orders.TABLE_NAME)
public class Orders {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = Order.ORDER_ID)
private long ordersId;
@Column(name = CURRENT_DATE)
private Date currentDate;
@Column(name = STATUS)
private String status;
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = REPRESENTATIVE_ID)
private Representative representative;
@LazyCollection(LazyCollectionOption.FALSE)
@ElementCollection(targetClass = Product.class)
@OneToMany(cascade = CascadeType.ALL)
@JoinTable(name = "ORDERS_SKU",
joinColumns = { @JoinColumn(name = ORDER_ID) },
inverseJoinColumns = { @JoinColumn(name = SKU_ID) })
private List<Sku> listSku;
}
Representative.java
@Entity
@Table(name = Representative.TABLE_NAME)
public class Representative implements java.io.Serializable {
@Id
@GeneratedValue (strategy=GenerationType.AUTO)
@Column(name = REPRESENTATIVE_ID)
private long representativeId;
@Column(name = FIRST_NAME)
private String representativeFirstName;
@Column(name = LAST_NAME)
private String representativeLastName;
@Column(name = EMAIL)
private String representativeEmail;
@Column(name = PASSWORD)
private String representativePassword;
@Column(name = EMPID)
private int representativeEmpId;
@JsonIgnore
@OneToOne(mappedBy="representative", cascade=CascadeType.PERSIST , fetch=FetchType.EAGER)
private Orders orders;
@JsonIgnore
@OneToOne(mappedBy="representative", cascade=CascadeType.ALL , fetch=FetchType.EAGER)
private Carts carts;
}
sku.java
@Entity
@Table(name = Sku.TABLE_NAME)
public class Sku implements java.io.Serializable {
@Id
@Column(name = SKU_ID)
private long skuId;
@Column(name = SKU_NAME)
private String skuName;
@Column(name = UNIT_NAME)
private String unitName;
@Column(name = SIZE)
private String size;
@Column(name = PRIZE)
private int prize;
@Column(name = QUANTITY)
private int quanity;
@ManyToOne(fetch = FetchType.EAGER , cascade=CascadeType.ALL)
@JoinColumn(name = PRODUCT_ID , nullable = false)
private Product product;
}
Product.java
@Entity
@Table(name = Product.TABLE_NAME)
public class Product implements java.io.Serializable {
@Id
@GeneratedValue (strategy=GenerationType.AUTO)
@Column(name = PRODUCT_ID)
private long productId;
@Column(name = PRODUCT_NAME )
private String productName;
@Column(name = SPECIALITY_ID)
private int specialtyId;
@LazyCollection(LazyCollectionOption.FALSE)
@ElementCollection(targetClass=Product.class)
@OneToMany(mappedBy="product" , cascade=CascadeType.ALL)
private List<Sku> listSkuOrders = new ArrayList<Sku>();
}
还有两个额外的表是通过@JoinTable注解创建的
我 1.carts_sku 2.orders_sku
购物车的服务实现方法:
/**
* Delete Cart
*
* @param id
* cart id
* @throws Exception
*/
@Override
@Transactional
public void deleteCart(long id) throws Exception {
cartsRepository.delete(id);
}
订单服务实现方法:
@Override
@Transactional
public Orders saveOrders(Orders orders) {
return ordersRepository.save(orders);
}
当我通过购物车 ID 删除购物车记录时,它被删除了,但它无法保存到订单中,它显示以下错误
org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passed to persist: com.xptraining.model.Representative; nested exception is org.hibernate.PersistentObjectException: detached entity passed to persist: com.xptraining.model.Representative
Caused by: org.hibernate.PersistentObjectException: detached entity passed to persist: com.xptraining.model.Representative
这里的问题是你试图保留一个分离的对象,在你的汽车中 class 你有
@OneToOne(cascade=CascadeType.ALL ,fetch=FetchType.EAGER)
@JoinColumn(name=REPRESENTATIVE_ID)
private Representative representative;
由于级联类型是 all ,所有操作都将被级联,包括删除。
cartServices.deleteCart(carts.getCartId());
删除购物车时,代表将被分离(因为您仍然持有对它的引用)
当您将其添加到订单并保存时会出现此问题。
要解决此问题,您需要重新附加对象或将级联类型更改为持久化
我认为您在 placeOrder1()
中的 carts
是分离的,因为它作为 JSON 请求出现。因此 carts.representative
也是分离的。您可能需要通过 session.merge()
或 entityManager.merge()
将 carts.representative
附加到会话(可能通过可以访问 session
的服务 class)参见 https://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/Session.html 用于重新附加的其他选项。
必须在尝试将 carts.representative
保存为 Order
的一部分之前完成附件
将CascadeType.ALL
更改为CascadeType.MERGE
CascadeType.ALL
尝试删除引用并使用新的 Id 重新插入,这会导致错误,但是 CascadeType.MERGE
尝试使用相同的引用并保留引用,然后更新新的数据(如果有)。
错误
Caused by: org.hibernate.PersistentObjectException: detached entity passed to persist: com.xptraining.model.Representative
推车控制器class
@POST
@Path(XpConstants.PLACE_ORDER)
@Consumes("application/json")
@Produces("application/json")
public Status placeOrder1(Carts carts) {
Representative r2 = carts.getRepresentative();
List<Sku> sList = carts.getListSku();
CartsOrderDto cartOrderDto = new CartsOrderDto();
Sku s = new Sku();
try {
cartOrderDto.setCartId(carts.getCartId());
cartOrderDto.setTotalBill(carts.getPrize());
cartOrderDto.setProductList(carts.getListSku());
cartOrderDto.setRepresentative(carts.getRepresentative());
Carts c = new Carts();
c.setCartId(carts.getCartId());
cartServices.deleteCart(carts.getCartId());
for (Sku sku : sList) {
s.setPrize(sku.getPrize());
s.setProduct(sku.getProduct());
s.setQuanity(sku.getQuanity());
s.setSize(sku.getSize());
s.setSkuId(sku.getSkuId());
s.setSkuName(sku.getSkuName());
s.setUnitName(sku.getUnitName());
skuServices.addSku(s);
}
Orders orders = new Orders();
orders.setCurrentDate(Utilities.getTodaysDate());
orders.setStatus("Active");
orders.setRepresentative(r2);
orders.setListSku(sList);
representativeServices.addRepresentative(r2);
orderServices.saveOrders(orders);
logger.info("Record saved in order and deleted from cart sucessfully");
return new Status(1, XpConstants.RECORD_SAVED);
} catch (Exception e) {
logger.error(XpConstants.ERROR_OCCURED, e);
}
return new Status(1, XpConstants.PLACED_WRONG_ID);
}
实体class是:
Cart.java
@Entity
@Table(name = "carts")
public class Carts {
@Id
@Column(name = CARTS_ID)
private long cartId;
@Column(name = PRIZE)
private int prize;
@ElementCollection(targetClass=Product.class)
@OneToMany(cascade = CascadeType.ALL , fetch=FetchType.EAGER )
@JoinTable(
name = "CARTS_SKU",
joinColumns = { @JoinColumn(name = CARTS_ID) },
inverseJoinColumns = { @JoinColumn(name = SKU_ID) }
)
private List<Sku> listSku;
@OneToOne(cascade=CascadeType.ALL ,fetch=FetchType.EAGER)
@JoinColumn(name=REPRESENTATIVE_ID)
private Representative representative;
}
Orders.java
@Entity
@Table(name = Orders.TABLE_NAME)
public class Orders {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = Order.ORDER_ID)
private long ordersId;
@Column(name = CURRENT_DATE)
private Date currentDate;
@Column(name = STATUS)
private String status;
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = REPRESENTATIVE_ID)
private Representative representative;
@LazyCollection(LazyCollectionOption.FALSE)
@ElementCollection(targetClass = Product.class)
@OneToMany(cascade = CascadeType.ALL)
@JoinTable(name = "ORDERS_SKU",
joinColumns = { @JoinColumn(name = ORDER_ID) },
inverseJoinColumns = { @JoinColumn(name = SKU_ID) })
private List<Sku> listSku;
}
Representative.java
@Entity
@Table(name = Representative.TABLE_NAME)
public class Representative implements java.io.Serializable {
@Id
@GeneratedValue (strategy=GenerationType.AUTO)
@Column(name = REPRESENTATIVE_ID)
private long representativeId;
@Column(name = FIRST_NAME)
private String representativeFirstName;
@Column(name = LAST_NAME)
private String representativeLastName;
@Column(name = EMAIL)
private String representativeEmail;
@Column(name = PASSWORD)
private String representativePassword;
@Column(name = EMPID)
private int representativeEmpId;
@JsonIgnore
@OneToOne(mappedBy="representative", cascade=CascadeType.PERSIST , fetch=FetchType.EAGER)
private Orders orders;
@JsonIgnore
@OneToOne(mappedBy="representative", cascade=CascadeType.ALL , fetch=FetchType.EAGER)
private Carts carts;
}
sku.java
@Entity
@Table(name = Sku.TABLE_NAME)
public class Sku implements java.io.Serializable {
@Id
@Column(name = SKU_ID)
private long skuId;
@Column(name = SKU_NAME)
private String skuName;
@Column(name = UNIT_NAME)
private String unitName;
@Column(name = SIZE)
private String size;
@Column(name = PRIZE)
private int prize;
@Column(name = QUANTITY)
private int quanity;
@ManyToOne(fetch = FetchType.EAGER , cascade=CascadeType.ALL)
@JoinColumn(name = PRODUCT_ID , nullable = false)
private Product product;
}
Product.java
@Entity
@Table(name = Product.TABLE_NAME)
public class Product implements java.io.Serializable {
@Id
@GeneratedValue (strategy=GenerationType.AUTO)
@Column(name = PRODUCT_ID)
private long productId;
@Column(name = PRODUCT_NAME )
private String productName;
@Column(name = SPECIALITY_ID)
private int specialtyId;
@LazyCollection(LazyCollectionOption.FALSE)
@ElementCollection(targetClass=Product.class)
@OneToMany(mappedBy="product" , cascade=CascadeType.ALL)
private List<Sku> listSkuOrders = new ArrayList<Sku>();
}
还有两个额外的表是通过@JoinTable注解创建的 我 1.carts_sku 2.orders_sku
购物车的服务实现方法:
/**
* Delete Cart
*
* @param id
* cart id
* @throws Exception
*/
@Override
@Transactional
public void deleteCart(long id) throws Exception {
cartsRepository.delete(id);
}
订单服务实现方法:
@Override
@Transactional
public Orders saveOrders(Orders orders) {
return ordersRepository.save(orders);
}
当我通过购物车 ID 删除购物车记录时,它被删除了,但它无法保存到订单中,它显示以下错误
org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passed to persist: com.xptraining.model.Representative; nested exception is org.hibernate.PersistentObjectException: detached entity passed to persist: com.xptraining.model.Representative
Caused by: org.hibernate.PersistentObjectException: detached entity passed to persist: com.xptraining.model.Representative
这里的问题是你试图保留一个分离的对象,在你的汽车中 class 你有
@OneToOne(cascade=CascadeType.ALL ,fetch=FetchType.EAGER)
@JoinColumn(name=REPRESENTATIVE_ID)
private Representative representative;
由于级联类型是 all ,所有操作都将被级联,包括删除。
cartServices.deleteCart(carts.getCartId());
删除购物车时,代表将被分离(因为您仍然持有对它的引用)
当您将其添加到订单并保存时会出现此问题。
要解决此问题,您需要重新附加对象或将级联类型更改为持久化
我认为您在 placeOrder1()
中的 carts
是分离的,因为它作为 JSON 请求出现。因此 carts.representative
也是分离的。您可能需要通过 session.merge()
或 entityManager.merge()
将 carts.representative
附加到会话(可能通过可以访问 session
的服务 class)参见 https://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/Session.html 用于重新附加的其他选项。
必须在尝试将 carts.representative
保存为 Order
将CascadeType.ALL
更改为CascadeType.MERGE
CascadeType.ALL
尝试删除引用并使用新的 Id 重新插入,这会导致错误,但是 CascadeType.MERGE
尝试使用相同的引用并保留引用,然后更新新的数据(如果有)。