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