Jpa @OneToMany@MANYTONE双向实体赢得';不能正确接受新实体(GlassFish)
旧的问题描述已过时 @谢谢你的提示,它帮助你摆脱了那个讨厌的错误 我拥有以下实体:Jpa @OneToMany@MANYTONE双向实体赢得';不能正确接受新实体(GlassFish),jpa,glassfish,entity,one-to-many,duplicates,Jpa,Glassfish,Entity,One To Many,Duplicates,旧的问题描述已过时 @谢谢你的提示,它帮助你摆脱了那个讨厌的错误 我拥有以下实体: @Entity @XmlRootElement @Table(name="WAITERENTITY") public class WaiterEntity implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = Generation
@Entity
@XmlRootElement
@Table(name="WAITERENTITY")
public class WaiterEntity implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval=true, fetch = FetchType.EAGER)
@JoinColumn(name = "waiter_id")
private List<OrderEntity> orders = new ArrayList<>();
{plus usual setters and getters}
}
编辑:我观察到非常奇怪的行为。首先,如果标有(2)
和(3)
的行未注释,则不会保留任何OrderEntity
。其次,只有以下外部语句才足以让GlassFish持久化一个OrderEntity
:
WaiterBean waiter = client.findByNameSingle(WaiterBean.class, "John Marston");
client.create(new OrderBean(waiter));
其中create将从数据库中获取相应的WaiterEntity
的唯一id。另一方面,如果不知道WaiterEntity
id,则不会持久化OrderEntity
,例如:
client.create(new OrderBean(new WaiterBean("Hans")));
因为此新对象不是从数据库获取的。当注释掉标有(1)的行时,出现strage行为:第一条语句之前从数据库中获取的相应的WaiterEntity
无效,但第二条语句没有从数据库中获取任何WaiterEntity
,将工作并在数据库中创建一个OrderEntity
条目。我真的很难理解这一点
注释的两行(2)
和(3)
应确保等待属性
知道其订单实体
s,以便以后检索。但这两行(或者其中一行,我也试过)所做的唯一事情是阻止任何OrderEntity
被持久化到数据库中。它不会做任何事情,也不会报告更多的错误,这让我发疯
有什么想法吗?提前谢谢 快速猜测是您添加了错误的
OrderEntity
实例。如果将实体实例传递给em.merge()
则EntityManager
将创建实体的新实例,从提供的实体复制状态,并管理新副本。您必须在有关此实体的任何进一步操作中使用新副本
代码:
public void create(OrderEntity e) {
WaiterEntity waiter = em.find(WaiterEntity.class, e.getWaiter().getId());
e = em.merge(e);
if (waiter != null) waiter.getOrders().add(e);
}
谢谢这有点帮助。我已更新我的问题描述。
WaiterBean waiter = client.findByNameSingle(WaiterBean.class, "John Marston");
client.create(new OrderBean(waiter));
client.create(new OrderBean(new WaiterBean("Hans")));
public void create(OrderEntity e) {
WaiterEntity waiter = em.find(WaiterEntity.class, e.getWaiter().getId());
e = em.merge(e);
if (waiter != null) waiter.getOrders().add(e);
}