8

我试图更好地熟悉 JPA,所以我创建了一个非常简单的项目。我有一个用户类和一个地址类。即使我将 Address 添加到我的 User 类中,我似乎也必须坚持两者?

用户:

import javax.persistence.*;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

@Entity
@Table(name = "usr") // @Table is optional, but "user" is a keyword in many SQL variants 
@NamedQuery(name = "User.findByName", query = "select u from User u where u.name = :name")
public class User {
    @Id // @Id indicates that this it a unique primary key
    @GeneratedValue // @GeneratedValue indicates that value is automatically generated by the server
    private Long id;

    @Column(length = 32, unique = true)
    // the optional @Column allows us makes sure that the name is limited to a suitable size and is unique
    private String name;

    // note that no setter for ID is provided, Hibernate will generate the ID for us

    @OneToMany(fetch=FetchType.LAZY, mappedBy="user")
    private List<Address> addresses;

地址:

@Entity
public class Address {

    @Id // @Id indicates that this it a unique primary key
    @GeneratedValue // @GeneratedValue indicates that value is automatically generated by the server
    private Long id;

    @Column(length=50)
    private String address1;

    @ManyToOne
    @JoinColumn(name="user_id")
    private User user;

实体管理器:

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

可能做错了什么......只是不确定它是什么?

任何建议,将不胜感激。

谢谢,

小号

4

3 回答 3

13

尝试cascade注释的元素。

@OneToMany(fetch=FetchType.LAZY, mappedBy="user", cascade=CascadeType.PERSIST) 
private List<Address> addresses; 

文档说默认情况下没有级联操作。它还指出级联操作是可选的,因此它实际上取决于您使用的实现。

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

于 2012-09-28T14:32:38.630 回答
7

你在说什么叫做级联。这意味着对嵌套对象执行相同的操作,例如Address您的User. 默认情况下,如果您不指定任何CascadeType.

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

@OneToMany(fetch=FetchType.LAZY, mappedBy="user", cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE})
private List<Address> addresses;

或者只是告诉 JPA 级联每个操作:

@OneToMany(fetch=FetchType.LAZY, mappedBy="user", cascade = CascadeType.ALL)
private List<Address> addresses;

两种方式都将导致,例如,一个持久化的Address同时持久化一个User或删除关联Address的一个User被删除。

但是!...如果您CascadeType.REMOVE从第一个示例中删除,则删除 anUser不会删除其关联Address(删除操作不会应用于嵌套对象)。

于 2012-09-28T14:37:34.607 回答
0

您正在使用 oneToMany 注释。据我了解,当您想向其添加子类(地址)时,您必须保留父类(USer)。

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

于 2012-09-28T14:32:58.180 回答