如何管理OnetoOne仅在子级中插入数据

时间:2017-04-05 08:52:34

标签: java hibernate jpa hibernate-mapping

我是hibernate的新手,我正在使用JPA和Hibernate4。尝试在子项中插入父对象作为onetoone关系。

我浏览了一些教程,但是网络中的所有示例都显示了,同时插入了父表和子表。

我只想在子表中插入数据。

我有两个名为user和department的表。

用户表包含用户详细信息,部门为关系,如下所示,

@Entity
@Table(name = "User")
public class UserEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "_id")
    private String id;

    @Column(name = "firstName")
    private String firstName;

    @Column(name = "lastName")
    private String lastName;

    @OneToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "departmentId")
    private Department departmentId;

    // getters and setters...

}

以下是我的部门实体,

@Entity
@Table(name = "Department")
public class Department {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "_id")
    private String id;

    @Column(name = "name")
    private String name;

    // getters and setters...
}

在部门表中只有4个数据。我想在插入数据时只插入用户数据中的数据,而不想在Department中插入。

我该怎么做。请协助。

3 个答案:

答案 0 :(得分:1)

您需要在所有者方mappedBy映射中使用OneToOne属性指定关系所有者,在Department类的情况下,您应该添加:

@OneToOne(mappedBy="department")
private UserEntity user;

我更新了您的代码,包含了明确的注释,并将Department类中的UserEntity属性从departmentId重命名为department,以避免在关系所有者和它的id

@Entity
@Table(name = "User")
public class UserEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "_id")
    private String id;

    @Column(name = "firstName")
    private String firstName;

    @Column(name = "lastName")
    private String lastName;

    @OneToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "departmentId")
    private Department department;

    // getters and setters...

}

以下是部门实体,

@Entity
@Table(name = "Department")
public class Department {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "_id")
    private String id;

    @Column(name = "name")
    private String name;

    @OneToOne(mappedBy="department")
    private UserEntity user;

    // getters and setters...
}

这将为您提供具有预期行为的正确映射。

答案 1 :(得分:1)

在@OneToOne注释中,参数optional的默认值为true。因此,您的注释与@OneToOne(fetch = FetchType.EAGER, optional = true)相同。这意味着您只需将Department实例中的UserEntity留空即可。在这种情况下,持久化会导致仅持久化用户实体而不持久化部门。

即使您创建了一个Department实例并将其分配给UserEntity实例,持久化UserEntity也不会自动保留部门,因为您的注释中没有任何cascade参数。如果您没有自动级联持久化,则必须先保留部门,然后再保留相应的用户实体。

也许您一直在询问如何将现有部门用于您的用户实体。在这种情况下,您首先需要通过Hibernate(或JPA API)从实体管理器获取部门。您获得的实体实例由Hibernate管理,然后您可以在UserEntity中设置它并持久保存,以使其引用该部门。

最后,我认为一个部门可能会有多个用户。拥有@ManyToOne注释而不是@OneToOne可能更有意义,表明多个用户可以引用同一个部门。但这取决于您的域模型。

答案 2 :(得分:1)

你必须使用mappedBy,如下面的子表中所示,Department在你的情况下

@OneToOne(mappedBy="department")
private UserEntity user;

这些帖子更好地解释了这一点,

JPA JoinColumn vs mappedBy

Understanding mappedBy annotation in Hibernate