我很难让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
的主键?
非常欢迎任何建议或其他解决方案!
谢谢!
答案 0 :(得分:2)
您可以使用Task
对象作为您的ID,有关示例,请参阅EmbeddedId
或IdClass
。如果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;
// ...
}