SQL JPA - 多列作为主键

时间:2016-12-14 13:31:35

标签: java sql jpa spring-boot entity

如果我想要一个严格的列来组成一个ID。

SQL示例:

CONSTRAINT [PK_NAME] PRIMARY KEY ([Column1],[Column2],[Column3])

我如何使用Jpa Entity类做到这一点?通过columndefinition?

只需将id字段设置为:

value = Column1 + Column2 + Column3 // aint working.

5 个答案:

答案 0 :(得分:25)

您需要为复合键创建一个类:

public class CompositeKey implements Serializable {
    private int column1;
    private int column2;
    private int column3;
}

然后在您的实体类中使用@IdClass注释:

@Entity
@IdClass(CompositeKey.class)
public class EntityExample {
    @Id
    private int column1;
    @Id
    private int column2;
    @Id
    private int column3;
    ...
    ...
}

我认为这应该有效。希望它有所帮助,欢呼!

是的,还有另一个解决方案,@ jklee提到的解决方案,两者都有效,这是一个偏好问题。

答案 1 :(得分:10)

使用@Embeddable@EmbeddedId

示例:

@Entity
public class Project {
    @EmbeddedId ProjectId id;
     :
}

@Embeddable
Class ProjectId {
    int departmentId;
    long projectId;
}

此处提供更多信息http://www.objectdb.com/java/jpa/entity/id#Embedded_Primary_Key_

答案 2 :(得分:5)

如果类中的所有字段都是主键的一部分,则解决方案将非常简单(扩展解决方案由@ raul-cuth提供):

@Entity
@IdClass(EntityExample.class)
public class EntityExample implements Serializable {

    @Id
    private int column1;

    @Id
    private int column2;

    @Id
    private int column3;
}

答案 3 :(得分:2)

  1. @IdClass类上使用@Entity注释,然后在属于复合主键的各个字段上使用@Id注释。
  2. 或者可以使用@Embeddable类,该类可以包含复合主键的各个字段,然后此类的引用可以用作@Embedded注释@Entity中的属性}类。 希望这会有所帮助。

答案 4 :(得分:0)

请注意,休眠的Entity-Class-to-SQL-DDL-Script生成器将对所有字段进行排序,并且无论其在定义中出现的顺序如何,都将创建表定义和索引/约束定义。按照字段的排序顺序。

尽管表定义中字段的出现顺序可能无关紧要,但是复合索引中字段的顺序肯定会起作用。因此,必须对键字段进行命名,以便在按其名称排序时,它们按您希望索引的顺序排列。