Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.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
Java 如果地址嵌套在用户中,为什么必须同时保留这两个对象?_Java_Jpa - Fatal编程技术网

Java 如果地址嵌套在用户中,为什么必须同时保留这两个对象?

Java 如果地址嵌套在用户中,为什么必须同时保留这两个对象?,java,jpa,Java,Jpa,我试图更好地熟悉JPA,所以我创建了一个非常简单的项目。我有一个用户类和一个地址类。看起来,即使我将地址添加到我的用户类中,我也必须同时保留这两个属性 用户: 实体管理器: EntityManager entityManager = Persistence.createEntityManagerFactory("tutorialPU").createEntityManager(); entityManager.getTransaction().begin(); User user = new

我试图更好地熟悉JPA,所以我创建了一个非常简单的项目。我有一个用户类和一个地址类。看起来,即使我将地址添加到我的用户类中,我也必须同时保留这两个属性

用户:

实体管理器:

EntityManager entityManager = Persistence.createEntityManagerFactory("tutorialPU").createEntityManager();

entityManager.getTransaction().begin();

User user = new User();
user.setName("User");

List<Address> addresses = new ArrayList<Address>();
Address address = new Address();
address.setAddress1("Address1");

addresses.add(address);
user.setAddresses(addresses);
entityManager.persist(user);
entityManager.persist(address);
entityManager.getTransaction().commit();
entityManager.close();
EntityManager EntityManager=Persistence.createEntityManager工厂(“tutorialPU”).createEntityManager();
entityManager.getTransaction().begin();
用户=新用户();
user.setName(“用户”);
列表地址=新的ArrayList();
地址=新地址();
地址。设置地址1(“地址1”);
地址。添加(地址);
user.setAddresses(地址);
entityManager.persist(用户);
entityManager.persist(地址);
entityManager.getTransaction().commit();
entityManager.close();
可能是做错了什么…只是不确定是什么

如有任何建议,将不胜感激

谢谢


S

尝试注释的
cascade
元素

@OneToMany(fetch=FetchType.LAZY, mappedBy="user", cascade=CascadeType.PERSIST) 
private List<Address> addresses; 
@OneToMany(fetch=FetchType.LAZY,mappedBy=“user”,cascade=CascadeType.PERSIST)
private List表示默认情况下不级联任何操作。它还声明级联操作是可选的,因此它实际上取决于您使用的实现


此外,在设置关系时,请确保设置了关系的双方。将地址设置为用户,并将用户设置为地址。

您正在使用oneToMany批注。根据我的理解,当您要向父类(用户)添加子类(地址)时,必须将其持久化


通过持久化用户类,您可以让JPA知道要更新哪一行

你说的是所谓的级联。这意味着对嵌套对象执行相同的操作,例如
用户中的
地址
。默认情况下,如果不指定任何
CascadeType
,则根本没有级联

您可以一次定义各种级联类型

@OneToMany(fetch=FetchType.LAZY, mappedBy="user", cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE})
private List<Address> addresses;
@OneToMany(fetch=FetchType.LAZY,mappedBy=“user”,cascade={CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REMOVE})
私人名单地址;
或者告诉JPA级联每个操作:

@OneToMany(fetch=FetchType.LAZY, mappedBy="user", cascade = CascadeType.ALL)
private List<Address> addresses;
@OneToMany(fetch=FetchType.LAZY,mappedBy=“user”,cascade=CascadeType.ALL)
私人名单地址;
例如,这两种方法都会导致在持久化
用户时持久化
地址
,或者在删除
用户时删除关联的
地址

但是!。。。如果从第一个示例中删除
CascadeType.remove
,则删除
用户不会删除其关联的
地址(删除操作不会应用于嵌套对象)。

。默认情况下,它不级联,而且它也是可选的。
@OneToMany(fetch=FetchType.LAZY, mappedBy="user", cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE})
private List<Address> addresses;
@OneToMany(fetch=FetchType.LAZY, mappedBy="user", cascade = CascadeType.ALL)
private List<Address> addresses;