如何管理 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
我是 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