代码之家  ›  专栏  ›  技术社区  ›  PaiS

冬眠zeroToOne

  •  1
  • PaiS  · 技术社区  · 15 年前

    我试图在两个实体之间建立一种零比一的关系。也就是说,父实体可以在没有关联子实体的情况下保存,也可以与关联的子实体一起保存。


    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;
    

    只有这样的关系和id列 MySql数据库中设置为自动递增的父(Employee)表 ,问题是,在保存父对象-子对象图时,出现以下异常

    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
    

    我试着设置 ,并且这样的父-gt;子对象图的持久化是成功的。 here 因此不希望在子项的id列上有自动递增


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


    2 回复  |  直到 15 年前
        1
  •  1
  •   PaiS    15 年前

    最后,多亏了帕斯卡和我身边的一些谷歌搜索,我终于成功了。显然,我不能将本机密钥生成器用于这样的关系,在这种关系中父对象可以不带子对象而存在(可选=true)。 最后成功的事情是下面的,这给我留下了一个缺点:必须处理Hibernate特定的注释(@GenericGenerator),而且还必须处理双向关系,而不是我想要的单向关系。

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

    没有 在Id列上设置自动增量。

    @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;
    

    不管怎么说,这有助于解决这些问题:-)

        2
  •  1
  •   Community Mohan Dere    9 年前

    这个 optional a的属性 OneToOne true 默认情况下,这是您想要的。

    但是,你在某种程度上误用了 @PrimaryKeyJoinColumn 这里(实际上,这取决于您真正想要实现什么,但是您当前的注释组合是不正确的)。

    你想映射一个 一对一 ,使用 @PrimaryKeyJoinColumn . 但在这种情况下,不要使用 GeneratedValue EmployeeInfo 并手动设置id,如果不想手动设置,请使用Hibernate 具体的 foreign your previous question . 同时检查下面提到的相关问题。

    以及 您不想使用共享主键(就像在您当前的代码中,因为您试图获取由数据库生成的id),那么 这个 PrimaryKeyJoinColumn .

    工具书类

      • 9.1.32款 注释

    相关问题