Hibernate - 如何使用生成器为引用表创建主键?

时间:2014-08-13 12:52:45

标签: java mysql hibernate jpa orm

我很难让Hibernate(使用MySQL)从“主表”生成参考表的主键。我的问题是我有一个25 mil行的大表,现在我需要添加多个额外的列,因为将来会有更多的列要添加我选择使用引用表的方式而不是添加列到主表(重建需要几个小时......:)

所以有一个主表和一个参考表。在我的构思中,参考表的主键应该从主表的主键生成。我可以先insert进入主表,然后select,然后将insert的主键用于参考表,但这对我来说似乎不是最好的方式。所以我想使用Hiibernate的generators,但我无法弄清楚如何。

这是主表:

@Entity 
@Table
public class Task {

    @Id
    @GeneratedValue
    @Column()
    private Integer id;

    // ...

    @OneToOne(mappedBy = "task_ref", orphanRemoval=true, fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private Stuff stuff;

    // ...
}

参考表:

@Entity
@Table
public class Stuff {

    @Id
    @Column(name = "stuff_id")
    @GeneratedValue()
    private Integer stuff_id;

    // ...

    @OneToOne(orphanRemoval=true, fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @PrimaryKeyJoinColumn
    private Task task_ref;

    // ...
}

那么..如何使用生成器从表Stuff的主键创建表Task的主键?

非常欢迎任何建议或其他解决方案!

谢谢!

2 个答案:

答案 0 :(得分:2)

您可以使用Task对象作为您的ID,有关示例,请参阅EmbeddedIdIdClass。如果Stuff表示域模型中Task实体的子类,则应该对此实体进行建模,您必须将Stuff实体表示为{{1 } Joined Subclass实体。在这两种情况下,不再需要Task实体中的额外Id

答案 1 :(得分:1)

这是您应该如何将双向OneToOne关联映射到共享主键:

@Entity 
@Table
public class Task {

    @Id
    @GeneratedValue
    private Integer id;

    // ...

    @OneToOne(mappedBy = "task_ref", orphanRemoval=true, fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private Stuff stuff;

// ...
}

@Entity
@Table
public class Stuff {

    @Id
    @Column(name = "stuff_id")
    private Integer stuff_id;

    // ...

    @OneToOne(fetch = FetchType.LAZY)        
    @MapsId 
    @JoinColumn(name = "stuff_id") 
    private Task task_ref;

    // ...
}
  1. 只有父级需要级联到Child实体,而不是相反。
  2. 父母只有协会的“反面”。
  3. 共享主键是子实体
  4. 中的主键和外键
  5. MapsId注释允许您共享@Id和OneToOne关联的主键