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

How to manage OnetoOne inserting data in child only

我是 hibernate 的新手,我正在使用 JPA 和 Hibernate4。尝试在 child 中插入 parent object 作为 onetoone 关系。

我浏览了一些教程,但网络中的所有示例都显示了插入 parent 和 child tables。

我只想在 child table 中插入数据。

我有两个 table 分别称为用户和部门。

用户table由用户详细信息与部门构成一对一关系,如下,

@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...
}

部门table只有4条数据。我只想在用户数据中插入数据,而不想在部门中插入。

如何做that.Please辅助

您需要在所有者端的 OneToOne 映射中使用 mappedBy 属性 指定关系所有者,这里是 Department [=29] =],你应该添加:

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

我更新了您的代码,以包含所述注释,并将您的 UserEntity class 中的 Department 属性 从 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...
}

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

在@OneToOne 注释中,参数optional 的默认值为真。所以你的注解和@OneToOne(fetch = FetchType.EAGER, optional = true)是一样的。这意味着您可以简单地将 UserEntity 实例中的 Department 留空。在那种情况下,坚持它会导致只坚持一个用户实体而不坚持部门。

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

您可能会询问有关为您的用户实体使用现有部门的问题。在这种情况下,您首先需要通过 Hibernate(或 JPA API)从实体管理器获取部门。您获得的实体实例由 Hibernate 管理,然后您可以将其设置在 UserEntity 中并持久化,以使其引用部门。

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

您必须为此使用 mappedBy,如下文中所述 Table,您的情况 Department

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

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

JPA JoinColumn vs mappedBy

Understanding mappedBy annotation in Hibernate