Many to many mapping usando Glorp

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
5 messages Options
Reply | Threaded
Open this post in threaded view
|

Many to many mapping usando Glorp

Chache Schulz
Hola, que tal!

Estoy tratando de mapear una relacion many to many en Glorp.

Tengo la clase usuario y la clase grupo, un usuario es dueño de muchos grupos y un grupo pertenece a un solo usuario; a su vez, tengo otra relacion en la que un grupo contiene muchos usuario y un usuario pertenece a muchos grupos.

Cuando intento mapear la relacion one to many, anda todo bien. El problema viene cuando intento mapear la relacion muchos a muchos. En diversos tutoriales de glorp explica como mapear sin especificar la tabla de asociacion, pero buscando encontre que es necesario especificarla debido a que tengo multiples relaciones con las mismas tablas

El codigo me genera correctamente la base de datos, y puedo crear grupos y asignarle un dueño, el problema viene cuando quiero agregar un usuario a un grupo determinado, no arroja ningun error, solo un "Se encontro fin de archivo inesperado en la conexion del cliente" en el log de PGAdmin.

Como se resolveria esto? Esta bien lo que estoy haciendo?

El mapeo que realice es el siguiente:

classModelForGroup: aClassModel

aClassModel newAttributeNamed: #id.
aClassModel newAttributeNamed: #name

classModelForUser: aClassModel

aClassModel newAttributeNamed: #id.
aClassModel newAttributeNamed: #username.
aClassModel newAttributeNamed: #password.
aClassModel newAttributeNamed: #tweets collectionOf: TwittAR.Tweet.
aClassModel newAttributeNamed: #groups collectionOf: TwittAR.Group.
aClassModel newAttributeNamed: #groupsIbelong collectionOf: TwittAR.Group

descriptorForGroup: aDescriptor

| table linkTable |
self tableNamed: 'GROUP_HAS_USER'.
linkTable := self tableNamed: 'GROUP_HAS_USER'.
table := self tableNamed: 'GROUPS'.
aDescriptor table: table.
(aDescriptor newMapping: Glorp.DirectMapping) from: #id to: (table fieldNamed: 'id').
(aDescriptor newMapping: Glorp.DirectMapping) from: #name to: (table fieldNamed: 'name').
(aDescriptor newMapping: Glorp.ManyToManyMapping)
attributeName: #members;
referenceClass: TwittAR.User;
mappingCriteria: (Glorp.Join
    from: (table fieldNamed: 'id')
    to: (linkTable fieldNamed: 'group_id')).
(aDescriptor newMapping: Glorp.ManyToManyMapping)
attributeName: #tweets;
referenceClass: TwittAR.Tweet

descriptorForUser: aDescriptor

| table linkTable |
table := self tableNamed: 'USERS'.
linkTable:= self tableNamed: 'GROUP_HAS_USER'.
aDescriptor table: table.
(aDescriptor newMapping: Glorp.DirectMapping) from: #id to: (table fieldNamed: 'id').
(aDescriptor newMapping: Glorp.DirectMapping) from: #username to: (table fieldNamed: 'username').
(aDescriptor newMapping: Glorp.DirectMapping) from: #password to: (table fieldNamed: 'password').
(aDescriptor newMapping: Glorp.OneToManyMapping) attributeName: #tweets.
(aDescriptor newMapping: Glorp.OneToManyMapping) attributeName: #groups.

(aDescriptor newMapping: Glorp.ManyToManyMapping)
attributeName: #groupsIbelong;
referenceClass: TwittAR.Group;
mappingCriteria: (Glorp.Join
    from: (table fieldNamed: 'id')
    to: (linkTable fieldNamed: 'user_id')).

tableForGROUPS: aTable

| owner |
(aTable createFieldNamed: 'id' type: platform sequence) bePrimaryKey.
aTable createFieldNamed: 'name' type: platform text.
owner := aTable createFieldNamed: 'user_id' type: platform int4.
aTable addForeignKeyFrom: owner to: ((self tableNamed: 'USERS') fieldNamed: 'id').

tableForUSERS: aTable

(aTable createFieldNamed: 'id' type: platform sequence) bePrimaryKey.
aTable createFieldNamed: 'username' type: platform text.
aTable createFieldNamed: 'password' type: platform text

tableForGROUP_HAS_USER: aTable

| groupKey userKey |
"(aTable createFieldNamed: 'id' type: platform sequence) bePrimaryKey."
userKey := aTable createFieldNamed: 'user_id' type: platform int4.
aTable addForeignKeyFrom: userKey to: ((self tableNamed: 'USERS') fieldNamed: 'id').
groupKey := aTable createFieldNamed: 'group_id' type: platform int4.
aTable addForeignKeyFrom: groupKey to: ((self tableNamed: 'GROUPS') fieldNamed: 'id'



--
To post to this group, send email to [hidden email]
To unsubscribe from this group, send email to [hidden email]
 
http://www.clubSmalltalk.org
Reply | Threaded
Open this post in threaded view
|

Re: Many to many mapping usando Glorp

Juan-2
Hola Cache

Te doy una respuesta parcial, y tiene que ver con postgres ya que lo conozco 
bien, no tengo tanta experiencia con Glorp asi que dejo eso a otra persona de la
lista, 
Me llama la atención la descripción del error, pienso que por el error podriamos ver
que es lo que esta saliendo mal, ese error es cuando se corta la conexion,
si en el archivo postgresql.conf  pones 
log_statement='all'
podras ver en el log que intento hacer con mas detalle.
tal vez esto sirva para encontrar la pista, quizas debas reiniciar el 
postgres a veces con reload alcanza, no se si estas en linux
/etc/init.d/postgresql restart 
ó (no se si  funciona)
/etc/init.d/postgresql reload

saludos 
jmdc



2012/8/13 Chache Schulz <[hidden email]>
PGAdmin

--
To post to this group, send email to [hidden email]
To unsubscribe from this group, send email to [hidden email]
 
http://www.clubSmalltalk.org
Reply | Threaded
Open this post in threaded view
|

Re: Many to many mapping usando Glorp

Chache Schulz
In reply to this post by Chache Schulz
Hola, que tal! Gracias por tu respuesta!
 
Mira, problema del Posgres no creo que sea, porque he probado otras cosas y funcionaron perfectamente. Estoy seguro que es un problema de mapeo por bastantes cosas que lei. Ahora voy a chusmear el log a ver si es algo de eso, pero no creo que sea!

--
To post to this group, send email to [hidden email]
To unsubscribe from this group, send email to [hidden email]
 
http://www.clubSmalltalk.org
Reply | Threaded
Open this post in threaded view
|

Re: Many to many mapping usando Glorp

Juan-2
Cache

Yo tampoco creo que sea problema del postgres, pero una mejor descripcion
dara mejores ideas de que pueda ser.


2012/8/13 Chache Schulz <[hidden email]>
Hola, que tal! Gracias por tu respuesta!
 
Mira, problema del Posgres no creo que sea, porque he probado otras cosas y funcionaron perfectamente. Estoy seguro que es un problema de mapeo por bastantes cosas que lei. Ahora voy a chusmear el log a ver si es algo de eso, pero no creo que sea!

--
To post to this group, send email to [hidden email]
To unsubscribe from this group, send email to [hidden email]
 
http://www.clubSmalltalk.org

--
To post to this group, send email to [hidden email]
To unsubscribe from this group, send email to [hidden email]
 
http://www.clubSmalltalk.org
Reply | Threaded
Open this post in threaded view
|

Re: Many to many mapping usando Glorp

Diogenes Moreira
Hola yo conozco bien glorp pero en pharo.. por los nombre de clases, creo que estas usando VW..

bueno el mapping de la relacion manytomany esta bien, para el usario grupos.. pero no veo que este bien el mapping de twitts.. el error no te esta dando por eso?

(aDescriptor newMapping: Glorp.ManyToManyMapping)
attributeName: #tweets;
referenceClass: TwittAR.Tweet

igual en tenes una forma de habilitar el log de los SQL que genera, creo que cuando creas la instancia de DatabaseSystem, pero no puedo asegurarte como es en VW.. Si le escribis a Alan Knigth el chabon se copa y contesta rapido.

Saludos



http://about.me/diogenes.moreira



El 13 de agosto de 2012 14:57, Juan <[hidden email]> escribió:
Cache

Yo tampoco creo que sea problema del postgres, pero una mejor descripcion
dara mejores ideas de que pueda ser.


2012/8/13 Chache Schulz <[hidden email]>
Hola, que tal! Gracias por tu respuesta!
 
Mira, problema del Posgres no creo que sea, porque he probado otras cosas y funcionaron perfectamente. Estoy seguro que es un problema de mapeo por bastantes cosas que lei. Ahora voy a chusmear el log a ver si es algo de eso, pero no creo que sea!

--
To post to this group, send email to [hidden email]
To unsubscribe from this group, send email to [hidden email]
 
http://www.clubSmalltalk.org

--
To post to this group, send email to [hidden email]
To unsubscribe from this group, send email to [hidden email]
 
http://www.clubSmalltalk.org

--
To post to this group, send email to [hidden email]
To unsubscribe from this group, send email to [hidden email]
 
http://www.clubSmalltalk.org