Untitled diff

Created Diff never expires
15 削除
合計
削除
単語
合計
削除
この機能を引き続き使用するには、アップグレードしてください
Diffchecker logo
Diffchecker Pro
70
45 追加
合計
追加
単語
合計
追加
この機能を引き続き使用するには、アップグレードしてください
Diffchecker logo
Diffchecker Pro
99
#include <iostream>
#include <iostream>
#include <memory>
#include <memory>
#include <Wt/Dbo/Dbo.h>
#include <Wt/Dbo/Dbo.h>
#include <Wt/Dbo/backend/Sqlite3.h>
#include <Wt/Dbo/backend/Sqlite3.h>


using namespace std;
using namespace std;
namespace dbo = Wt::Dbo;
namespace dbo = Wt::Dbo;


class EntityA
class EntityA
{
{
public:
public:
string name {"Jef"};
string name {"Jef"};


template<class Action>
template<class Action>
void persist(Action& a)
void persist(Action& a)
{
{
dbo::field(a, name, "name");
dbo::field(a, name, "name");
}
}
};
};


class EntityB
class EntityB
{
{
public:
public:
string name {"Jef Jr."};
string name {"Jef Jr."};
dbo::ptr<EntityA> parent;

static shared_ptr<dbo::Session> session;
static void setSession(shared_ptr<dbo::Session> s)
{
session = s;
}


template<class Action>
template<class Action>
void persist(Action& a)
void persist(Action& a)
{
{
dbo::field(a, name, "name");
dbo::field(a, name, "name");
dbo::belongsTo(a, parent, "parent");
dbo::belongsTo(a, parent, "parent");
}
}

unique_ptr<EntityA> getParent() const
{
dbo::Transaction t{*session};
return make_unique<EntityA>(*parent);
}

void setParent(dbo::ptr<EntityA> p)
{
parent = p;
}

void setParent(unique_ptr<EntityA> p)
{
parent.reset(move(p));
}

private:
dbo::ptr<EntityA> parent {nullptr};
};
};


dbo::ptr<EntityB> getAnyB(dbo::Session& session)
shared_ptr<dbo::Session> EntityB::session = nullptr;

dbo::ptr<EntityB> getAnyB(shared_ptr<dbo::Session> session)
{
{
dbo::Transaction t{session};
dbo::Transaction t{*session};


return session.find<EntityB>().limit(1);
return session->find<EntityB>().limit(1);
}
}


int main()
int main()
{
{
dbo::Session session;
auto session = make_shared<dbo::Session>();


session.setConnection([](){
session->setConnection([](){
auto sqlite3 = make_unique<dbo::backend::Sqlite3>(":memory:");
auto sqlite3 = make_unique<dbo::backend::Sqlite3>(":memory:");
sqlite3->setProperty("show-queries", "true");
sqlite3->setProperty("show-queries", "true");


return move(sqlite3);
return move(sqlite3);
}());
}());


session.mapClass<EntityA>("entity_a");
session->mapClass<EntityA>("entity_a");
session.mapClass<EntityB>("entity_b");
session->mapClass<EntityB>("entity_b");


session.createTables();
session->createTables();

EntityB::setSession(session);


{
{
dbo::Transaction t{session};
dbo::Transaction t{*session};


auto b = make_unique<EntityB>();
auto b = make_unique<EntityB>();
b->parent = session.add(make_unique<EntityA>());
b->setParent(
session.add(move(b));
session->add(make_unique<EntityA>())
);
session->add(move(b));
}
}


//dbo::Transaction t{session}; // This "fixes" the problem, but it's VERY inconvenient
cout << getAnyB(session)->getParent()->name;
cout << getAnyB(session)->parent->name; // Exception: Dbo load(): no active transaction


return 0;
return 0;
}
}