Отображение класса, который состоит только из составного ПК без @IdClass или @EmbeddedId - PullRequest
1 голос
/ 17 октября 2011

У меня есть две таблицы A и B с простыми ПК.

@Entity
public class A { 
    @Id
    public int idA;
}

@Entity
public class B { 
    @Id
    public int idB;
}

Я хочу отобразить новый класс ассоциации AB, который просто хранит отношения между A и B, с составным PK idA + idB. AB не имеет никаких дополнительных столбцов, только отношение между idA и idB.

Можно ли отобразить AB, используя один класс? Я хочу избежать создания нового ABId класса, просто чтобы использовать его как @IdClass или @EmbeddedId в AB, и я не хочу отображать это с @ManyToMany ассоциацией на A или B.

Ответы [ 2 ]

3 голосов
/ 17 октября 2011

Почему вы хотите отобразить такую ​​таблицу соединений?Просто используйте связь ManyToMany между A и B. Эта таблица соединения будет обрабатываться автоматически, когда вы добавите / удалите B в / из списка B, содержащегося в A.

См. http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#d0e11402

Если вы действительно хотите это сделать, просто сопоставьте два идентификатора с нотацией @Id.Первичным классом будет сам класс сущности (который должен быть сериализуемым), как объяснено в справочной документации hibernate .Обратите внимание, что это зависит от Hibernate.

0 голосов
/ 17 октября 2011

Было бы хорошо, если бы предложение @JBNizet сработало.К сожалению, существует старая ошибка , которая делает невозможным ее принятие в версии, которую я использую (3.3.1-GA)

Я, наконец, разобрался с этим, определив внутреннийстатический идентификатор класса и использование его как @IdClass:

@Entity
@Table(name="TABLE_AB")
@IdClass(value=ClassAB.ClassABId.class)
public class ClassAB implements Serializable {

    private String idA;
    private String idB;

    @Id
    public String getIdA(){ return idA; }
    public void setIdA(String idA){ this.idA = idA; }

    @Id
    public String getIdB(){ return idB; }
    public void setIdB(String idB){ this.idB = idB; }

    static class ClassABId implements Serializable {
        private String idA;
        private String idB;

        @Column(name="ID_A")
        public String getIdA(){ return idA; }
        public void setIdA(String idA){ this.idA = idA; }

        @Column(name="ID_B")
        public String getIdB(){ return idB; }
        public void setIdB(String idB){ this.idB = idB; }

        // HashCode(), equals()
    }
}

Таким образом, мне не нужно определять новый открытый класс, и мне не нужно изменять файл сопоставлений, чтобы включить класс идентификатора.

...