【问题标题】:Squeryl relation 1:NSqueryl 关系 1:N
【发布时间】:2016-02-26 04:30:54
【问题描述】:

我在使用 Squeryl ORM 时遇到了一些问题。非常基本的功能(例如选择或插入没有关系的行)可以正常工作,当我尝试在微不足道的情况下获取具有关系 1:N 的数据时就会出现问题。 在测试数据库中,我创建了两个表问题和答案。一个问题可以包含多个答案。这是创建表的 SQL:

DROP TABLE IF EXISTS `questions`;
CREATE TABLE `questions` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `nid` int(11) NOT NULL,
  `text` text NOT NULL,
  `active` tinyint(1) NOT NULL DEFAULT '1',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `questions` (`id`, `nid`, `text`, `active`)
VALUES
(1,1,'test question',1),
(2,2,'second question',1);

DROP TABLE IF EXISTS `answers`;
CREATE TABLE `answers` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `question_id` int(11) unsigned NOT NULL,
  `text` text NOT NULL,
  PRIMARY KEY (`id`),
  KEY `qwerty` (`question_id`),
  CONSTRAINT `qwerty` FOREIGN KEY (`question_id`) REFERENCES `questions` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `answers` (`id`, `question_id`, `text`)
VALUES
(1,1,'test answer');

这是带有模型类的 Scala 代码:

class BaseEntity extends KeyedEntity[Long] { val id: Long = 0 }

class Question(var nid: Long, var text: String, 
      var active: Integer) extends BaseEntity {

    def this() = this(0, "", 1)
    lazy val Answers: List[Answer] = DataBase.answersToQuestion.left(this).toList
}

class Answer(var question_id: Long, var text: String) extends BaseEntity { 
    def this() = this(0, "")
    lazy val Question: Question = DataBase.answersToQuestion.right(this).head
}

object DataBase extends Schema {
    val questions = table[Question]("questions")
    val answers = table[Answer]("answers")
    val answersToQuestion = oneToManyRelation(questions, answers)
        .via((q, a) => q.id === a.question_id)

    on(answers)(a => declare( a.id is (autoIncremented) ))
    on(questions)(q => declare( q.id is (autoIncremented) ))
}

所以在数据选择时,我得到完整的 Question 对象,但 Answers 始终为空。

var question: Option[Question] = inTransaction { DataBase.questions.lookup(1L) }
//question.Answers is null !!

有人可以看看是并告诉我我的错误是什么吗?

【问题讨论】:

  • 是否有任何错误从 SQL 返回到您的数据库连接器?您可能想从那里开始。
  • 完全没有错误。其他字段检索成功

标签: mysql scala squeryl


【解决方案1】:

也许我只是希望另一种行为或以某种方式错误配置的 ORM,虽然我在调试器中得到 null,但对于 Answer 类来说,这种方式工作正常:

def getQuestion = inTransaction(Question.headOption)

问题是这样的:

def getAnswers = inTransaction(Answers.toList)

希望这对刚接触 Squeryl 并遇到与我相同问题的人有所帮助。

到目前为止,不要将问题标记为已回答,因为也许有更好的解决方案。

【讨论】:

  • 对数据库的所有调用都需要在事务中发生,因此在一个事务之外请求答案是行不通的——我很惊讶没有错误,因为 Squeryl 通常会抛出一个.无论如何,如果您删除了lazy,它可能也对您有用,尽管它会在检索时填充它。或者,您也可以在原始对象中添加 inTransaction - 例如:lazy val Answers: List[Answer] = inTransaction { DataBase.answersToQuestion.left(this).toList }inTransaction 将加入现有事务(如果存在),因此嵌套很好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-15
  • 2022-09-23
  • 1970-01-01
相关资源
最近更新 更多