【发布时间】:2012-05-31 11:40:19
【问题描述】:
Hibernate 在 JoinTable (List) 中声明复合主键
如何使用 HQL(Hibernate 查询语言)在边表中声明复合主键?以前我在课堂上声明了一个可连接的,一切正常,它创建了两列的复合主键。这是我使用的代码:
之前(工作)
@Id
@SequenceGenerator(name="someSequence", sequenceName="SEQ_APP", allocationSize =1)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="appSequence")
@Column(name="id")
private int setting_id;
@OneToOne
private User user;
@ManyToMany
@JoinTable(
name="tbl_settings_objectproxy",
joinColumns = @JoinColumn(name = "id"),
inverseJoinColumns = @JoinColumn( name = "objectproxy_id")
)
private Set<SomeObject> objectproxy;
现在我整理了所有内容,将 Set 更改为 List 并添加了另一个边桌。现在hibernate按照它应该做的那样创建两个边表,但它没有声明任何主键......有人知道如何解决这个问题吗?这是我的新代码:
AFTER(不再创建复合主键,甚至不声明任何主键)
@Id
@SequenceGenerator(name="someSequence", sequenceName="SEQ_APP", allocationSize =1)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="appSequence")
@Column(name="id")
private int setting_id;
@OneToOne
private User user;
@ManyToMany
@JoinTable(
name="tbl_settings_objectproxy",
joinColumns = @JoinColumn(name = "id"),
inverseJoinColumns = @JoinColumn( name = "objectproxy_id")
)
private List<SomeObject> objectProxyForSomething;
【问题讨论】:
-
我想将集合声明为集合而不是列表会做到这一点。或者您也可以自己创建数据库模式,这样您就可以为所欲为。旁注:HQL 是 Hibernate Query 语言。您的问题与查询和 HQL 无关。
-
那我该如何声明复合主键呢?而且我不想将列表更改为设置。
-
创建表tbl_settings_objectproxy_for_something(id号不为空,objectproxy_id号不为空,约束tbl_settings_objectproxy_for_something_pk(id,objectproxy_id))
-
我不想手动创建我的表,因为这样就失去了 hibernate go 的全部用处,因为现在我可以说:persist(object) 它会自动查看对象是否已经在数据库中并且需要被更新或者如果对象是新的并且将为对象创建一个新条目。所以我不必编写任何 HQL,我只需为选择查询编写 HQL。确实是 Set to List 转换导致了问题,我刚刚验证了这一点。
-
Hibernate 不需要自己创建数据库即可工作。 Hibernate 将使用您告诉它使用的数据库。如果表和映射匹配,那么一切当然会按预期工作。我不会告诉你避免使用 Hibernate。我告诉你,如果需要,你可以自己创建数据库模式。
标签: java hibernate composite-primary-key pie-chart