2013-04-07 4 views
0

J'ai eu des erreurs en essayant de faire des relations plusieurs-à-plusieurs dans Slick. Ce test montre comment faire des relations plusieurs-à-plusieurs dans Slick. Je l'ai suivi mais aller cette erreur:Déclarer des tables dans Slick

Select(TableNode, "id") found. This is typically caused by an attempt to use a "raw" table object directly in a query without introducing it through a generator 

J'ai alors découvert que cela est causé en déclarant vos tables à un endroit statique (un objet), puis essayer de l'importer (il fonctionne très bien si l'objet est dans le même bloc). http://slick.typesafe.com/doc/1.0.0/lifted-embedding.html#tables

Ok, donc val T = new Table à l'intérieur d'un object est la réponse. Mais maintenant, je reçois cette erreur:

recursive method bs needs result type 

Il n'a pas besoin d'un type de résultat si elle est un object et non un val. J'ai entendu parler de l'utilisation d'un class mais je ne trouve pas d'exemples sur la façon de le faire.

Comment déclarez-vous des modèles many-to-many et importez-les ailleurs?

EDIT: Voici un point essentiel montrant ce que je veux dire: https://gist.github.com/pjrt/5332311

Si vous exécutez le premier test, il passera, pas de problème.

Si vous exécutez le second test, l'erreur suivante est générée:

scala.slick.SlickException: Select(TableNode, "id") found. This is typically caused by an attempt to use a "raw" table object directly in a query without introducing it through a generator. 

Si vous exécutez le troisième test (à l'aide vals à l'intérieur des objets au lieu d'objets directement), vous obtenez cette erreur:

recursive method bs needs result type 
[error] val A = new Table[(Int, String)]("a") { 

recursive value AToB needs type 
[error]  def as = AToB.filter(_.bId === id).flatMap(_.aFK) 

Je sais pourquoi les erreurs se produisent, mais je veux savoir comment les gens les ont contournées. Une façon est de placer les objets dans une classe et d'instancier une classe chaque fois que vous voulez utiliser Slick (mais cela semble ... bizarre). Un autre est de ne jamais utiliser des trucs liés à Slick en dehors du paquet (ou du moins des trucs many-to-many) mais cela semble aussi mauvais.

Ma question est toujours de savoir comment vous en sortir? Y a-t-il un moyen approprié?

+1

Vous ne pouvez pas partager le code de votre table? – pedrofurla

+0

Ajout d'un aperçu pour montrer ce que je veux dire. – Nacht

+0

Si vous créez un cas de test Slick et soumettez une requête pull github, nous pouvons en prendre une de plus près. S'il vous plaît le placer dans https://github.com/slick/slick/tree/master/slick-testkit/src/main/scala/com/typesafe/slick/testkit/tests ou https://github.com/slick/ slick/tree/master/test-slick/src/test/scala/scala/slick/test/levé – cvogt

Répondre

0

Le message d'erreur que vous avez montré me fait penser que vous avez défini vos tables mais que vous avez essayé d'y accéder directement au lieu d'utiliser un pour la compréhension.

Le test file you were referring a un bon exemple au fond, après avoir défini les nombreux à plusieurs tables qui va comme

val q1 = for { 
    a <- A if a.id >= 2 
    b <- a.bs 
} yield (a.s, b.s) 
q1.foreach(x => println(" "+x)) 
assertEquals(Set(("b","y"), ("b","z")), q1.list.toSet) 

Ce que vous voyez est la table d'objet A est utilisé comme un générateur de compréhension (c.-à-a <- A

Votre code accède-t-il aux tables d'une autre manière?

+0

J'ai ajouté un aperçu de l'OP montrant ce que je veux dire. – Nacht