Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jpa @OneToMany@MANYTONE双向实体赢得';不能正确接受新实体(GlassFish)_Jpa_Glassfish_Entity_One To Many_Duplicates - Fatal编程技术网

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);
}