Relacionamento N:N com hibernate

4 respostas
R

Bom dia galera.

Pro favor… me ajudem… ja tentei de tudo.
Estou tentando fazer um relacionamento N:N no hibernate e nao estou conseguindo… Esta acontecendo o seguinte erro:

10:42:30,866 DEBUG SQL:324 - select roles0_.fk_users as fk1_1_, roles0_.pk_roles as pk2_1_, roles1_.pk_roles as pk1_0_, roles1_.role as role2_0_ from roles_x_users roles0_ inner join public.roles roles1_ on roles0_.pk_roles=roles1_.pk_roles where roles0_.fk_users=?
10:42:30,866 DEBUG AbstractBatcher:378 - preparing statement
com.mchange.v2.c3p0.impl.NewPooledConnection@40afb9 invalidated by Exception: org.postgresql.util.PSQLException: ERROR: column roles0_.pk_roles does not exist

Abaixo segue explicação do que eu fiz.

Eu tenho 3 tabelas: users, roles, users_x_roles
Duas classes: Users e Roles

Sendo que tentei mapear da seguinte forma:

public class Users implements java.io.Serializable {

// Fields

private Integer pkUsers;

private String name;

private String login;

private String password;

private Set roles = new HashSet(0);

//geters and seters



}
public class Roles  implements java.io.Serializable {

// Fields

private Integer pkRoles;

private String role;

private Set users = new HashSet(0);

//geters and seters



}
<hibernate-mapping>
    <class name="br.com.icontrol.model.persistence.to.Users" table="users" schema="public">

        <id name="pkUsers" type="integer">
            <column name="pk_users" precision="8" scale="0" />
            <generator class="increment" />
        </id>
        
        <property name="name" type="string">
            <column name="name" length="100" not-null="true" />
        </property>
        
        <property name="login" type="string">
            <column name="login" length="15" not-null="true" />
        </property>
        
        <property name="password" type="string">
            <column name="password" length="32" not-null="true" />
        </property>
        
        <set name="roles" table="roles_x_users" inverse="true">
            <key>
                <column name="fk_users" precision="8" scale="0" not-null="true" />
            </key>
            <many-to-many class="br.com.icontrol.model.persistence.to.Roles" column="pk_roles" />
        </set>
        
    </class>    
</hibernate-mapping>


<hibernate-mapping>
    <class name="br.com.icontrol.model.persistence.to.Roles" table="roles" schema="public">
        <id name="pkRoles" type="integer">
            <column name="pk_roles" precision="8" scale="0" />
            <generator class="increment" />
        </id>
        
        <property name="role" type="string">
            <column name="role" length="15" not-null="true" />
        </property>
        
        <set name="users" table="roles_x_users" inverse="true">
            <key>
                <column name="fk_roles" precision="8" scale="0" not-null="true" />
            </key>
            <many-to-many class="br.com.icontrol.model.persistence.to.Users" column="pk_users"/>
        </set>
        
    </class>
</hibernate-mapping>

4 Respostas

B

Você tem a coluna pk_roles na sua tabela users?

R

Nao… eu percebi que ele reclama dessa coluna… mas ela nao deveria existir mesmo ! certo :?:

CREATE TABLE users
(
  pk_users numeric(8) NOT NULL DEFAULT nextval('sq_users'::regclass),
  name varchar(100) NOT NULL,
  "login" varchar(15) NOT NULL,
  "password" varchar(32) NOT NULL,
  CONSTRAINT ctr_users PRIMARY KEY (pk_users)
) 

CREATE TABLE roles
(
  pk_roles numeric(8) NOT NULL DEFAULT nextval('sq_roles'::regclass),
  "role" varchar(15) NOT NULL,
  CONSTRAINT ctr_roles_access PRIMARY KEY (pk_roles)
) 


CREATE TABLE roles_x_users
(
  pk_roles_x_users numeric(8) NOT NULL DEFAULT nextval('sq_roles_x_users'::regclass),
  fk_users numeric(8) NOT NULL,
  fk_roles numeric(8) NOT NULL,
  CONSTRAINT ctr_roles_x_users PRIMARY KEY (pk_roles_x_users),
  CONSTRAINT ctr_roles FOREIGN KEY (fk_roles)
      REFERENCES roles (pk_roles) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT ctr_users FOREIGN KEY (fk_users)
      REFERENCES users (pk_users) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)
B

Ué, então pq você mapeia essa coluna no seu arquivo? deve ser outro nome de coluna que você queira então…

_fs

Breve erro seu, na declaração de ambos os elementos , troque as colunas de “pk_” para “fk_”, como declarado na tabela roles_x_users.

Criado 24 de maio de 2006
Ultima resposta 24 de mai. de 2006
Respostas 4
Participantes 3