Olá pessoal!
Estou com um problema no uso da JPA para a representação de um relacionamento maluco (Vide anexo):
CONNECTION representa a existência de uma conexão entre duas formas geométricas (não necessáriamente distintas).
LINK representa a ligação entre dois pontos de duas formas geométricas.
Uma conexão pode ser estabelecida por um ou mais links.
Meu problema está na hora de representar no JPA a classe para a entidade LINK. Abaixo segue o que já tentei fazer:
Tenho criada uma classe LinkPK anotada com @Embedded.
1)Uma primeira tentativa, foi utilizar o @EmbeddedId. Nesta abordagem, as classes ficaram assim:
@Embeddable
public class LinkPK implements java.io.Serializable {
private static final long serialVersionUID = 5114770736427051887L;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="connectionId")
private Connection connection;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="dotIdTo")
private Dot dotTo;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="dotIdFrom")
private Dot dotIdFrom;
...
}
@Entity
@Table(name="LINK")
public class Link implements java.io.Serializable {
private static final long serialVersionUID = -2439429883405985924L;
@EmbeddedId
private LinkPK id;
...
}
@Entity
@Table(name="CONNECTION")
public class Connection implements java.io.Serializable {
private static final long serialVersionUID = 6486629810580504521L;
@Id
@GeneratedValue
private long id;
@OneToMany(mappedBy="connection")
private List<Link> links;
...
}
@javax.persistence.Entity
@Table(name="DOT")
public class Dot implements java.io.Serializable {
private static final long serialVersionUID = 9067572139934777767L;
@Id
@GeneratedValue
private long id;
@OneToMany(mappedBy="dotTo")
private List<Link> toRole;
@OneToMany(mappedBy="dotFrom")
private List<Link> fromRole;
...
}
O problema com essa abordagem foi que o Hibernate não consegue criar as tabelas, pois ele diz não encontrar os “mappedBy” na classe Link. Assumi que isso se deu por conta dos “mappedBy” estarem declarados na classe LinkPK, e abortei esta estratégia.
2)A segunda idéia foi utilizar o @IdClass. Aí só a classe Link e LinkPK foram alteradas:
@Embeddable
public class LinkPK implements java.io.Serializable {
private static final long serialVersionUID = 5114770736427051887L;
private Connection connection;
private Dot dotTo;
private Dot dotIdFrom;
...
}
@Entity
@Table(name="LINK")
@IdClass(LinkPK.class)
public class Link implements java.io.Serializable {
private static final long serialVersionUID = -2439429883405985924L;
@Id
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="connectionId")
private Connection connection;
@Id
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="dotIdTo")
private Dot dotTo;
@Id
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="dotIdFrom")
private Dot dotIdFrom;
...
}
Neste caso, o Hibernate até cria as tabelas, porém ele não consegue definir as foreign keys da tabela LINK. Segue o log na hora da geração das FK:
ERROR: [] Unsuccessful: alter table LINK add constraint FKC58BCE062FC9C056 foreign key (connection) references CONNECTION
2010-08-06 09:50:43,713 [main] org.hibernate.tool.hbm2ddl.SchemaExport
ERROR: [] Column 'CONNECTION.id' is not the same data type as referencing column 'LINK.connection' in foreign key 'FKC58BCE062FC9C056'.
2010-08-06 09:50:43,713 [main] org.hibernate.tool.hbm2ddl.SchemaExport
ERROR: [] Unsuccessful: alter table LINK add constraint FKC58BCE0656EB087F foreign key (dotTo) references DOT
2010-08-06 09:50:43,713 [main] org.hibernate.tool.hbm2ddl.SchemaExport
ERROR: [] Column 'DOT.id' is not the same data type as referencing column 'LINK.dotTo' in foreign key 'FKC58BCE0656EB087F'.
2010-08-06 09:50:43,713 [main] org.hibernate.tool.hbm2ddl.SchemaExport
ERROR: [] Unsuccessful: alter table LINK add constraint FKC58BCE0650B2A88E foreign key (dotTo) references DOT
2010-08-06 09:50:43,713 [main] org.hibernate.tool.hbm2ddl.SchemaExport
ERROR: [] Column 'DOT.id' is not the same data type as referencing column 'LINK.dotTo' in foreign key 'FKC58BCE0650B2A88E'.
2010-08-06 09:50:43,729 [main] org.hibernate.tool.hbm2ddl.SchemaExport