4

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按照它应该做的那样创建两个边表,但它没有声明任何主键......有人知道如何解决这个问题吗?这是我的新代码:

之后(它不再创建复合主键,它甚至没有声明任何主键)

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

1 回答 1

6

答案/解决方案:

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

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

  3. 如果您喜欢使用 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 的评论,因为这些是他的解决方案,但他在评论中给出了它们而不是答案。

于 2012-05-31T14:08:27.830 回答