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

标签 java hibernate composite-primary-key pie-chart


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


如何使用 HQL(Hibernate 查询语言)在副表中声明复合主键?以前我在我的类(class)中声明了一个可连接的并且一切正常,它创建了一个两列的复合主键。这是我使用的代码:

之前(工作)

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

最佳答案

答案/解决方案:

  1. Change the List<> to a 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 的评论,因为这些是他的解决方案,但他在评论而不是答案中给出了它们。

关于java - Hibernate 在 JoinTable (List<>) 中声明复合主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10832865/

相关文章:

Java错误找不到符号类Scanner.using jdk 6

java - 在 Java 8 中加载自定义 TimeZoneNameProvider

hibernate - 创建初始索引时出现 TransientObjectException

java - 使用 Hibernate 执行单独的、隔离的操作,在操作之间共享对象

sql - 无法添加 SQL 外键约束

sql - 为具有几列组合唯一的表选择一个好的主键

java - 无法将 DWR 与 Spring 合并

java - 如何在不构建字符串的情况下使用 JDBC 进行扩展插入?

java - 如何从 JPAspersistence.xml 中外部化属性?

java - 如何在 hbm.xml 文件中的 hibernate 中创建复合主键