簡體   English   中英

在JPA中使用多對多關系中的復合鍵

[英]Using a composite key in a many-to-many relationship in JPA

我有以下情況:

  • User對象具有一組權限對象( Set<Permission>
  • 每個用戶可以擁有零個或多個權限
  • Permission對象有三個字段
  • 權限的三個字段構成該權限的復合鍵。
  • 因此,我們只需要每個Permission的DB中的一個實例。 每個用戶可能具有相同的權限。
  • 因此,User對象與Permission具有多對多關系。

問題是:在這種情況下,我如何使Permission實體成為自身的復合鍵? 在這種多對多關系的背景下,我特別感興趣。

有任何想法嗎?

1ºApermission對象有三個字段

權限上限的三個字段組成復合鍵

屬性和復合主鍵共享相同的列

所以你的問題看起來像這個

@Entity
public class Permission {

    private PermissionId permissionId;

    private Integer field1;
    private Integer field2;
    private Integer field3;

    // required no-arg constructor   
    public Permission() {}

    public Permission(Integer field1, Integer field2, Integer field3) {
        this.field1 = field1;
        this.field2 = field2;
        this.field3 = field3;

        setPermissionId(new PermissonId(Integer field1, Integer field2, Integer field3));
    }

    @EmbeddedId
    public PermissionId getPermissionId() {
        return this.permissionId;
    }

    @Column(name="FIELD_1", insertable=false, updatable=false)
    public Integer getField1() {
        return this.field1;
    }

    @Column(name="FIELD_2", insertable=false, updatable=false)
    public Integer getField2() {
        return this.field2;
    }

    @Column(name="FIELD_3", insertable=false, updatable=false)
    public Integer getField3() {
        return this.field3;
    }

    @Embeddable
    public static class PermissionId implements Serializable {

        private Integer field1;
        private Integer field2;
        private Integer field3;

        // required no-arg constructor
        public PermissionId() {}

        public PermissionId(Integer field1, Integer field2, Integer field3) {
            this.field1 = field1;
            this.field2 = field2;
            this.field3 = field3;
        }

        @Column(name="FIELD_1", nullable=false)
        public Integer getField1() {
            return this.field1;
        }

        @Column(name="FIELD_2", nullable=false)
        public Integer getField2() {
            return this.field2;
        }

        @Column(name="FIELD_3", nullable=false)
        public Integer getField3() {
            return this.field3;
        }

        public boolean equals(Object o) {
            if(o == null) 
                return false;

            if(!(o instanceof PermissionId))
                return false;

            final PermissionId other = (PermissionId) o;

            if(!(getField1().equals(other.getField1()))) 
                return false;

            if(!(getField2().equals(other.getField2()))) 
                return false;

            if(!(getField3().equals(other.getField3()))) 
                return false;

            return true;
        }

        // requered hashcode impl
        public int hashcode() {
            // code goes here     
        }

    }

}

但是別忘記了

由於多個屬性共享同一列 ,因此必須將其中一個定義為insertable = false,updatable = false。 否則,Hibernate會抱怨一些錯誤。

如果有復合主鍵,則必須設置其值。 Hibernate不支持自動生成復合主鍵。

如果您不喜歡上面顯示的方法,您可以執行以下操作

@Entity
@IdClass(PermissionId.class)
public class Permission {

    private Integer field1;
    private Integer field2;
    private Integer field3;

    // required no-arg constructor   
    public Permission() {}

    public Permission(Integer field1, Integer field2, Integer field3) {
        this.field1 = field1;
        this.field2 = field2;
        this.field3 = field3;
    }

    @Id
    @Column(name="FIELD_1", nullable=false)
    public Integer getField1() {
        return this.field1;
    }

    @Id
    @Column(name="FIELD_2", nullable=false)
    public Integer getField2() {
        return this.field2;
    }

    @Id
    @Column(name="FIELD_3", nullable=false)
    public Integer getField3() {
        return this.field3;
    }

    @Embeddable
    public static class PermissionId implements Serializable {

        private Integer field1;
        private Integer field2;
        private Integer field3;

        // required no-arg constructor
        public PermissionId() {}

        public PermissionId(Integer field1, Integer field2, Integer field3) {
            this.field1 = field1;
            this.field2 = field2;
            this.field3 = field3;
        }

        @Column(name="FIELD_1")
        public Integer getField1() {
            return this.field1;
        }

        @Column(name="FIELD_2")
        public Integer getField2() {
            return this.field2;
        }

        @Column(name="FIELD_3")
        public Integer getField3() {
            return this.field3;
        }

        public boolean equals(Object o) {
            if(o == null) 
                return false;

            if(!(o instanceof PermissionId))
                return false;

            final PermissionId other = (PermissionId) o;

            if(!(getField1().equals(other.getField1()))) 
                return false;

            if(!(getField2().equals(other.getField2()))) 
                return false;

            if(!(getField3().equals(other.getField3()))) 
                return false;

            return true;
        }

        // requered hashcode impl
        public int hashcode() {
            // code goes here     
        }

    }

}

問候,

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM