我是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中插入。
我该怎么做。请协助。
答案 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;
这些帖子更好地解释了这一点,