Hibernate: uma chave estrangeira para duas tabelas diferentes
5 respostas
Wanderley2k
PessoALL,
Tenho uma tabela onde uma coluna chvproserv que serve como relacionamento para duas outras tabelas. Como não posso mexer na estrutura do banco pois trata-se de um quebra galho de um sistema existente. Gostaria de mapear isto com o hibernate.
Segue a estrutura das classes que refletem a estrutura no banco de dados:
@Entity
public class Osi implements Serializable {
...
private Integer chvosi;
private Integer chvproserv;
...
}
@Entity
public class Serv implements Serializable {
...
private Integer chvserv; // primarykey
...
}
@Entity
public class Prod implements Serializable {
...
private Integer chvpro; // primarykey
...
}
Tentei diversas abordagens mas nada até este momento.
Abdon não é isto que preciso. Tenho um id para duas tabelas.
Wonder, tentei fazer dois relacionamentos @One-toOne na classe Osi e dá erro pois não é possivel fazer dois joins. Tentei fazer relacionamento via mappedBy e nada.
Para piorar o atributo referencedColumn não funciona.
Wanderley2k
Tentei isso também:
@Column(updatable=false,insertable=false)@Formula("( select s.* from Serv as s where s.chvserv=chvproserv ) ")publicServgetServico(){returnservico;}
Mas acabei de descobrir que @formula aceita somente SQL e não HSQL
Erro:
Hibernate:selectthis_.chvosaschvos1_,this_.chvbfjaschvbfj3_1_,this_.demasdem3_1_,this_.detasdet3_1_,this_.dtvalasdtval3_1_,this_.duaasdua3_1_,this_.nfasnf3_1_,this_.npedasnped3_1_,this_.npedCasnpedC3_1_,this_.orcasorc3_1_,this_.resasres3_1_,this_.usrasusr3_1_,this_.vldescasvldesc3_1_,this_.vlimpasvlimp3_1_,this_.vlproasvlpro3_1_,this_.vlserasvlser3_1_,this_.vltotasvltot3_1_,this_.chvvndaschvvnd3_1_,this_.statusasstatus3_1_,osi2_.chvosaschvos3_,osi2_.chvosiaschvosi3_,osi2_.chvosiaschvosi0_,osi2_.duaasdua4_0_,osi2_.usrasusr4_0_,osi2_.chvesqaschvesq4_0_,osi2_.chvproservaschvproserv4_0_,osi2_.cmiascmi4_0_,osi2_.icmasicm4_0_,osi2_.ipiasipi4_0_,osi2_.issasiss4_0_,osi2_.chvosaschvos4_0_,osi2_.qtdasqtd4_0_,osi2_.servasserv4_0_,osi2_.vluasvlu4_0_,osi2_.vtotasvtot4_0_,(selects.*fromServasswheres.chvserv=osi2_.chvproserv)asformula0_0_fromOsthis_leftouterjoinOsiosi2_onthis_.chvos=osi2_.chvosExceptioninthread"main"org.hibernate.exception.GenericJDBCException:couldnotexecutequeryatorg.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:82)atorg.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:70)atorg.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)atorg.hibernate.loader.Loader.doList(Loader.java:1596)atorg.hibernate.loader.Loader.list(Loader.java:1577)atorg.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:111)atorg.hibernate.impl.SessionImpl.list(SessionImpl.java:1322)atorg.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:300)atbr.com.centauro.dao.Dao.listAtPage(Dao.java:47)atbr.com.empresario.modelo.dao.TesteClasses.testeOs(TesteClasses.java:70)atbr.com.empresario.modelo.dao.TesteClasses.main(TesteClasses.java:116)Causedby:java.sql.SQLException:[Microsoft][Driver ODBC para Microsoft Access]VocêgravouumasubconsultaquepoderetornarmaisdeumcamposemusarapalavrareservadaEXISTSnacláusulaFROMdaconsultaprincipal.RevejaainstruçãoSQLdasubconsultaparaqueamesmasoliciteapenasumcampo.atsun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6958)atsun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7115)atsun.jdbc.odbc.JdbcOdbc.SQLExecute(JdbcOdbc.java:3150)atsun.jdbc.odbc.JdbcOdbcPreparedStatement.execute(JdbcOdbcPreparedStatement.java:214)atsun.jdbc.odbc.JdbcOdbcPreparedStatement.executeQuery(JdbcOdbcPreparedStatement.java:89)atcom.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:75)atorg.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:120)atorg.hibernate.loader.Loader.getResultSet(Loader.java:1272)atorg.hibernate.loader.Loader.doQuery(Loader.java:391)atorg.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:218)atorg.hibernate.loader.Loader.doList(Loader.java:1593)...7more
Wanderley2k
Na classe Serv.java
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name="chvserv", referencedColumnName="chvproserv")
public Osi getOsi() {
return osi;
}
O atributo referencedColumnName ainda não está funcionando.