Hibernate 在 JoinTable (List<>) 中声明复合主键

Posted

技术标签:

【中文标题】Hibernate 在 JoinTable (List<>) 中声明复合主键【英文标题】:Hibernate declare composite primary key in JoinTable (List<>) 【发布时间】: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。我告诉你,如果需要,你可以自己创建数据库模式。 【参考方案1】:

答案/解决方案:

    将 List 更改为 Set 将在这种情况下发挥所有作用。

    您可以 使用 HQL 手动创建表。

    如果你坚持使用 List 我只知道一种方法 使用“columnDefinition”声明(单个)主键 你可以将两个列设置为唯一通过 使用“@UniqueConstraint”注释设置唯一约束 像这样:

@ManyToMany
@JoinTable(
    name="tbl_settings_objectproxy_for_something",
    joinColumns = @JoinColumn(name = "id", columnDefinition = "int primary key"),
    inverseJoinColumns = @JoinColumn( name = "objectproxy_id")
    uniqueConstraints = @UniqueConstraint(columnNames="id", "objectproxy_id")
    )
private List<SomeObject> SomeObjectProxy;

投票支持 JB Nizet 的评论,因为这些是他的解决方案,但他在评论中给出了它们而不是答案。

【讨论】:

以上是关于Hibernate 在 JoinTable (List<>) 中声明复合主键的主要内容,如果未能解决你的问题,请参考以下文章

JPA 2.0 (Hibernate) 使用 @JoinTable 为 @OneToMany 生成不正确的连接表 PK

hibernate----1-N--jointable(人与地址)

码农小汪-Hibernate学习8-hibernate关联关系注解表示@OneToMany mappedBy @ManyToMany @JoinTable

New @JoinTable导致nativeQuery中的org.hibernate.exception.SQLGrammarException,我们没有头绪

删除元素时使用 JoinTable 和 OrderColumn 的 Hibernate 单向 OneToMany 映射中的约束冲突

优化 Spring-data / Hibernate ManyToMany 插入