【问题标题】:SQL JPA - Multiple columns as primary keySQL JPA - 多列作为主键
【发布时间】:2017-04-29 20:39:24
【问题描述】:

如果我想用严重的 Column 来组成一个 ID。

SQL 示例:

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

如何使用 Jpa Entity 类做到这一点?通过列定义?

只需将 id 字段设置为:

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

【问题讨论】:

    标签: java sql jpa spring-boot entity


    【解决方案1】:

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

    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 提到的那个,两者都有效,这是一个偏好问题。

    【讨论】:

    【解决方案2】:

    使用@Embeddable@EmbeddedId

    例子:

    @Entity
    public class Project extends Serializable {
        @EmbeddedId ProjectId id;
    }
     
    @Embeddable
    class ProjectId extends Serializable {
        int departmentId;
        long projectId;
    }
    

    更多信息在这里http://www.objectdb.com/java/jpa/entity/id#Embedded_Primary_Key_

    【讨论】:

    • 别忘了实现 Serializable ;-)
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:
      1. @Entity 类上使用@IdClass 注释,然后在作为复合主键一部分的各个字段上使用@Id 注释。
      2. 或者可以使用@Embeddable 类,该类可以由复合主键的各个字段组成,然后可以将此类的引用用作@Embedded 注释中@Entity 类中的属性。 希望这会有所帮助。

      【讨论】:

        【解决方案5】:

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

        虽然表定义中字段的出现顺序可能无关紧要,但复合索引中字段的顺序肯定很重要。因此,您的关键字段必须命名,以便在按名称排序时它们符合您希望索引的顺序)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-05-26
          • 1970-01-01
          • 2021-09-27
          • 2011-02-07
          • 2010-11-23
          • 2020-05-27
          • 1970-01-01
          相关资源
          最近更新 更多