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

Ben*_*Ben 4 java hibernate composite-primary-key pie-chart


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;
Run Code Online (Sandbox Code Playgroud)

现在我仔细检查了所有内容,将 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;
Run Code Online (Sandbox Code Playgroud)

Ben*_*Ben 5

答案/解决方案:

  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;
Run Code Online (Sandbox Code Playgroud)

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