1

我正在尝试在两个实体之间建立零对一的关系。也就是说,Parent 可以在没有关联的 Child 实体的情况下保存,也可以与关联的 Child 一起保存。以下是 2 个实体类...


员工(父母)

public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

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

    @PrimaryKeyJoinColumn
    @OneToOne(cascade = {CascadeType.ALL})
    private EmployeeInfo info;

    @Column(name="EMP_ENUM")
    private Integer enumId;

员工信息(儿童)

public class EmployeeInfo {
        @Id
        @GeneratedValue(strategy=GenerationType.AUTO)
        private Long id;

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

在 MySql DB 中,将唯一 Parent (Employee) 表的这种关系和 id 列设置为 AUTO INCREMENT ,问题是在保存 Parent->Child 对象图时,我得到以下异常

org.springframework.orm.hibernate3.HibernateJdbcException: JDBC exception on Hibernate data access: SQLException for SQL [insert into EMP_INFO 
Caused by: java.sql.SQLException: Field 'id' doesn't have a default value

我尝试在 DB 中将 Child Table 的 Id 属性设置为 AUTO INCREMENT,这样的 Parent->Child 对象图的持久性是成功的。但是,这里描述的问题浮出水面,因为我有一个场景,我想在没有关联 EmpInfo 对象的情况下保存父 (Employee) 对象,因此不希望在 Child's id column 上有 AUTO INCREMENT


一种解决方案可能是不使用 PrimaryKeyJoinColumn,而是使用特定的 JoinColumn,但这会在我现有的表中添加一个不必要的列。


有没有人遇到过这样的问题?如果是的话,任何指针都会很有帮助。

4

2 回答 2

1

最后,感谢 Pascal 和我的一些谷歌搜索,我得到了它的工作。显然,我不能将本机密钥生成器用于这样的关系,其中父项可以在没有子项的情况下存在(可选 = true)。最终起作用的是以下内容,这让我不得不处理 Hibernate 特定注释 (@GenericGenerator) 并且还不得不处理双向关系而不是我想要的单向关系。

Employee (Parent) class remains unchanged as above. It has AUTO INCREMENT on the Id column.

至于子类 (EmployeeInfo),它更改为以下内容,并且再次没有在 Id 列上设置 AUTO INCREMENT。

@Table(name="EMP_INFO")
@Entity
public class EmployeeInfo {
    @Id
    @GeneratedValue(generator="foreign")
    @GenericGenerator(name="foreign", strategy = "foreign", parameters={
    @Parameter(name="property", value="verifInfo")}) 
    private Long id;

    @OneToOne(optional=false)
    @JoinColumn (name="id")
    private Employee emp;

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

这帮助我实现了我想要的,但不利的一面是,GenericGenerator 不是 JPA 注释,它是一个休眠注释,遗憾的是我现在不得不这样做,因为 JPA 目前不支持这个(或任何类似的)注释.

无论如何,这有助于解决这种情况:-)

于 2010-08-18T06:43:01.293 回答
1

我有一个场景,我想在没有关联 EmpInfo 对象的情况下保存父 (Employee) 对象。

a的optional属性OneToOnetrue默认的,这就是你想要的。

但是,您在某种程度上滥用了@PrimaryKeyJoinColumn此处(嗯,这实际上取决于您真正想要实现的目标,但您当前的注释组合不正确)。

如果您想OneToOne 使用共享主键映射 a ,请使用@PrimaryKeyJoinColumn. 但在这种情况下,不要使用GeneratedValueonEmployeeInfo并手动设置 id,或者,如果您不想手动设置,请使用我在上一个问题中已经提到的 Hibernate特定 生成器。还要检查下面提到的相关问题。foreign

如果不想使用共享主键(例如在当前代码中,因为您试图获取数据库生成的 id),则不要使用PrimaryKeyJoinColumn.

你必须做出选择。

参考

  • JPA 1.0 规范:
    • 9.1.32PrimaryKeyJoinColumn注释

相关问题

于 2010-08-17T17:17:47.343 回答