Olá,
Segue a seguinte modelagem: uma classe Seleção possui um relacionamento UNIDIRECIONAL com a classe Jogador. Acontece que o DBA determinou que o identificador da classe Jogador seria formado pelo identificador da classe Seleção e o índice determinado pela listagem de jogadores da seleção, conforme a seguir:
@Entity
public class Selecao {
@Id
@GeneratedValue
@Column(name="SELECAO_ID")
private Integer id;
@OneToMany(cascade=CascadeType.PERSIST)
@JoinColumn(name="SELECAO_ID")
@IndexColumn(name="JOGADOR_INDEX")
private List<Jogador> jogadorList = new ArrayList<Jogador>();
// outras propriedades específicas da classe Seleção
}
Simples, não ? Agora vamos a classe Jogador
@Entity
public class Jogador {
@EmbeddedId
private JogadorId id;
// outras propriedades específicas da classe Jogador
}
Por fim, a classe que modela o identificador da classe Jogador
@Embeddable
public class JogadorId implementes Serializable {
@Column(name="SELECAO_ID")
private Integer selecaoId;
@Column(name="JOGADOR_INDEX")
private Integer jogadorIndex;
// equals hashcode
}
A lógica da aplicação determina que os jogadores são sempre salvos com a seleção. Acontece que, baseado na modelagem acima exposta, gostaria de persistir diretamente da camada de aplicação (após a validação dos dados) com um simples código similar ao seguinte:
Selecao selecao = new Selecao();
selecao.getJogadorList().add(new Jogador());
selecao.getJogadorList().add(new Jogador());
selecao.getJogadorList().add(new Jogador());
session.save(selecao);
Acontece que não encontrei uma solução plausível para o problema. O Hibernate na maioria das vezes gera exceções informando que campos encontram-se duplicados etc. Veja que, baseado na modelagem, não é, pelo menos na teoria, necessário configurar o identificador da classe Jogador uma vez que eles são configurados na própria classe Seleção.
Alguém se habilitaria a desvendar a configuração que, respeitando essa modelagem, seria capaz de fazer essa aplicação funcionar
Agradeço desde já
Arthur Ronald F D Garcia