[Hibernate] - Associação ternária - Tabela de junção com atributos

0 respostas
Spool

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:
class Category {
  int id;
  // othres
}

class Item {
  int id;
  // others
}
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.

Criado 10 de maio de 2011
Respostas 0
Participantes 1