ServiceFramework
ServiceFramework copied to clipboard
多对一关联时怎么在保存多的一端是保存一的对象
多对一关联时怎么在保存多的一端是保存一的对象
通常多的一端包含外键,所以一般的ORM框架都回将主控端设置在多的一端。那么当保存多的同时保存单个对象是最容易实现的。举个例子:
tag 和 tag_synonym 多对一的关系。多个tag组成一个同义词组。 我们在create 一个tag的同时,把一个TagSynonym实例赋给tag就行。 这里我写了两个测试用例,一个是保存多的一端同时保存单个一端。 第二个例子则相反。
@Test
public void oneToMany() {
String tagName = "jack";
String tagSynonymName = "wowo";
TagSynonym tagSynonym = TagSynonym.create(map("name", tagSynonymName));
Tag tag = Tag.create(map("name", tagName));
tag.associate("tag_synonym").set(tagSynonym);
tag.save();
//手动提交事物
dbCommit();
tagSynonym = TagSynonym.where("name=:name", map("name", tagSynonymName)).single_fetch();
assertTrue(tagSynonym != null);
tag = Tag.where("name=:name", map("name", tagName)).single_fetch();
assertTrue(tag != null);
tagSynonym.delete();
tag.delete();
}
//或许你不喜欢使用associate 这种方法。那么你可以这样首先在Tag 中定义一个方法
public Association tag_synonym() {
throw new AutoGeneration();
}
接着你就可以像下面改写上面的测试用例了:
@Test
public void OneToMany2() {
String tagName = "jack";
String tagSynonymName = "wowo";
Tag tag = Tag.create(map("name", tagName));
tag.tag_synonym().set(TagSynonym.create(map("name", tagSynonymName)));
tag.save();
dbCommit();
TagSynonym tagSynonym = TagSynonym.where("name=:name", map("name", tagSynonymName)).single_fetch();
assertTrue(tagSynonym != null);
tag = Tag.where("name=:name", map("name", tagName)).single_fetch();
assertTrue(tag != null);
tagSynonym.delete();
tag.delete();
}
//这个是单数端级联保存多数端
@Test
public void manyToOne() {
String tagName = "jack";
String tagSynonymName = "wowo";
TagSynonym tagSynonym = TagSynonym.create(map("name", tagSynonymName));
Tag tag = Tag.create(map("name", tagName));
tagSynonym.associate("tags").add(tag);
tagSynonym.save();
dbCommit();
tagSynonym = TagSynonym.where("name=:name", map("name", tagSynonymName)).single_fetch();
assertTrue(tagSynonym != null);
tag = Tag.where("name=:name", map("name", tagName)).single_fetch();
assertTrue(tag != null);
tagSynonym.delete();
tag.delete();
}
希望能对你有帮助
另外已经修正了你之前的raw sql 问题。 你可以像下面那样调用:
@Test
public void testSqlQuery() {
Tag tag = Tag.create(map("name", "java"));
tag.save();
dbCommit();
List<Map> lists = Tag.nativeSqlClient().query("select * from Tag");
assertTrue(lists.size() == 1);
Tag.deleteAll();
}
@Test
public void testSqlQuery2() {
Tag.nativeSqlClient().execute("insert into tag(name) value('java')");
List<Map> lists = Tag.nativeSqlClient().query("select * from Tag");
assertTrue(lists.size() == 1);
Tag.deleteAll();
}