ServiceFramework icon indicating copy to clipboard operation
ServiceFramework copied to clipboard

多对一关联时怎么在保存多的一端是保存一的对象

Open zhouzhenhao opened this issue 12 years ago • 2 comments

多对一关联时怎么在保存多的一端是保存一的对象

zhouzhenhao avatar Oct 15 '12 10:10 zhouzhenhao

通常多的一端包含外键,所以一般的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();
    }

希望能对你有帮助

allwefantasy avatar Oct 15 '12 14:10 allwefantasy

另外已经修正了你之前的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();

    }

allwefantasy avatar Oct 15 '12 14:10 allwefantasy