Отображение класса, который состоит только из составного ПК без @IdClass или @EmbeddedId

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

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

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

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

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

2 ответа

Решение

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

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

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

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

Я, наконец, разобрался с этим, определив внутренний статический класс ID и используя его как @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()
    }
}

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

Другие вопросы по тегам