Отображение класса, который состоит только из составного ПК без @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.