Criei uma classe para representar a associação, uma vez que ela possui alguns atributos além das FK´s.
A estrutura esta completa e funcionando. A única divergência que encontrei foi do quando o Hibernate gera o DDL para criar a tabela de junção.
Possuo quatro atributos na tabela, sendo que dois correspondem as tabelas associadas, de fato, e outros dois são atributos.
Quando o Hibernate gera o DDL, esta colocando todos os quatro campos como PK da tabela, sendo que deveriam ser apenas os dois correspondentes as FK´s das tabelas associadas.
Como contorno essa situação?
UPDATE
De acordo com o exemplo no livro Hibernate In Action:
[code]
class Category {
int id;
// othres
}
class Item {
int id;
// others
}[/code]
A classe intermediária:
class CategorizedItem {
int category_id; // tem que fazer parte da PK
int item_id; // tem que fazer parte da PK
String added_by_user; // não pode fazer parte da PK
Date added_on; // não pode fazer parte da PK
}
A forma de mapeamento: Tabela de junção para uma coleção de componentes.
A classe CategorizedItem detalhada:
@Embeddable
class CategorizedItem {
@org.hibernate.annotations.Parent
private Category category;
@ManyToOne
@JoinColumn(name="ITEM_ID", nullable=false, updatable=false)
private Item item;
@ManyToOne
@JoinColumn(name="USER_ID", nullable=false, updatable=false)
private User user;
@Temporal(TemporalType.TIMESTAMP)
@Column(name="ADDED_ON", nullable=false, updatable=false)
private Date dateAdded;
// ...
// getter´s and setter´s; equals e hashCode
}
E na classe Category, foi adicionado a coleção:
@org.hibernate.annotations.CollectionOfElements
@JoinTable(name="CATEGORY_ITEM", joinColumns=@JoinColumn(name="CATEGORY_ID"))
private Set<CategorizedItem> categorizedItems = new HashSet<CategorizedItem>();
At.