SQL JPA - 多列作为主键

And*_*sen 14 java sql entity jpa spring-boot

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

SQL示例:

CONSTRAINT [PK_NAME] PRIMARY KEY ([Column1],[Column2],[Column3])
Run Code Online (Sandbox Code Playgroud)

我怎么能用Jpa Entity类做到这一点?通过columndefinition?

只需将id字段设置为:

value = Column1 + Column2 + Column3 // aint working.
Run Code Online (Sandbox Code Playgroud)

Rau*_*uth 33

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

public class CompositeKey implements Serializable {
    private int column1;
    private int column2;
    private int column3;
}
Run Code Online (Sandbox Code Playgroud)

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

@Entity
@IdClass(CompositeKey.class)
public class EntityExample {
    @Id
    private int column1;
    @Id
    private int column2;
    @Id
    private int column3;
    ...
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 请注意,需要实现 equals / hashCode (请参阅 https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#identifiers-composite) (2认同)

jkl*_*lee 12

使用@Embeddable@EmbeddedId.

例:

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

@Embeddable
Class ProjectId {
    int departmentId;
    long projectId;
}
Run Code Online (Sandbox Code Playgroud)

更多信息,请访问http://www.objectdb.com/java/jpa/entity/id#Embedded_Primary_Key_

  • 不要忘记实现可序列化;-) (2认同)

her*_*oin 7

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

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

    @Id
    private int column1;

    @Id
    private int column2;

    @Id
    private int column3;
}
Run Code Online (Sandbox Code Playgroud)