Использование составного ключа в отношениях многих ко многим в JPA

У меня следующая ситуация:

  • Объект User имеет набор объектов Permission (Set<Permission>)
  • Каждый пользователь может иметь ноль или более разрешений
  • Объект разрешения имеет три поля
  • Три поля Разрешения составляют композит ключ для этого разрешения.
  • Вследствие этого мы хотим точно один экземпляр в БД каждого разрешения. Каждый пользователь может потенциально имеют такое же разрешение.
  • Пользовательский объект поэтому имеет отношения «многие ко многим» с разрешением.

Вопрос в том, как в этой ситуации сделать объект Permission составным ключом? Я особенно заинтересован в том, чтобы делать это в контексте этих отношений «многие ко многим».

Есть идеи?

4 голоса | спросил GaryF 3 MarpmWed, 03 Mar 2010 13:16:41 +03002010-03-03T13:16:41+03:0001 2010, 13:16:41

1 ответ


0

Объект разрешения имеет три поля

Три поля Разрешения составляют составной ключ

Первичные ключи свойств и составные первичные ключи используют одни и те же столбцы

Итак, ваш вопрос выглядит так

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

    }

}

Но не забывай

  

Поскольку несколько свойств имеют один и тот же столбец , вы должны определить одно из них как inserttable = 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     
        }

    }

}

С уважением,

ответил Arthur Ronald 4 MaramThu, 04 Mar 2010 07:16:36 +03002010-03-04T07:16:36+03:0007 2010, 07:16:36

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132