1 module htestmain; 2 3 import std.stdio; 4 import std.string; 5 import std.conv; 6 import hibernated.core; 7 import std.traits; 8 version( USE_SQLITE ) 9 { 10 import ddbc.drivers.sqliteddbc; 11 import hibernated.dialects.sqlitedialect; 12 } 13 version( USE_PGSQL ) 14 { 15 import ddbc.drivers.pgsqlddbc; 16 import hibernated.dialects.pgsqldialect; 17 } 18 19 // Annotations of entity classes 20 @Table( "gebruiker" ) 21 class User { 22 long id; 23 string name; 24 int some_field_with_underscore; 25 @ManyToMany // cannot be inferred, requires annotation 26 LazyCollection!Role roles; 27 //@ManyToOne 28 MyGroup group; 29 } 30 31 class Role { 32 int id; 33 string name; 34 @ManyToMany // w/o this annotation will be OneToMany by convention 35 LazyCollection!User users; 36 } 37 38 @Entity 39 class MyGroup { 40 long id; 41 string name; 42 @OneToMany 43 LazyCollection!User users; 44 } 45 46 void testHibernate() { 47 // setup DB connection 48 version( USE_SQLITE ) 49 { 50 SQLITEDriver driver = new SQLITEDriver(); 51 string[string] params; 52 DataSource ds = new ConnectionPoolDataSourceImpl(driver, "zzz.db", params); 53 Dialect dialect = new SQLiteDialect(); 54 } 55 version( USE_PGSQL ) 56 { 57 string url = PGSQLDriver.generateUrl( "/tmp", 5432, "testdb" ); 58 string[string] params; 59 params["user"] = "hdtest"; 60 params["password"] = "secret"; 61 params["ssl"] = "true"; 62 PGSQLDriver driver = new PGSQLDriver(); 63 DataSource ds = new ConnectionPoolDataSourceImpl(driver,url, params); 64 Dialect dialect = new PGSQLDialect(); 65 } 66 67 // create metadata from annotations 68 writeln("Creating schema from class list"); 69 EntityMetaData schema = new SchemaInfoImpl!(User, Role, MyGroup); 70 //writeln("Creating schema from module list"); 71 //EntityMetaData schema2 = new SchemaInfoImpl!(htestmain); 72 73 74 writeln("Creating session factory"); 75 // create session factory 76 SessionFactory factory = new SessionFactoryImpl(schema, dialect, ds); 77 scope(exit) factory.close(); 78 79 writeln("Creating DB schema"); 80 DBInfo db = factory.getDBMetaData(); 81 { 82 Connection conn = ds.getConnection(); 83 scope(exit) conn.close(); 84 db.updateDBSchema(conn, true, true); 85 } 86 87 88 // create session 89 Session sess = factory.openSession(); 90 scope(exit) sess.close(); 91 92 // use session to access DB 93 94 writeln("Querying empty DB"); 95 Query q = sess.createQuery("FROM User ORDER BY name"); 96 User[] list = q.list!User(); 97 writeln("Result size is " ~ to!string(list.length)); 98 99 // create sample data 100 writeln("Creating sample schema"); 101 MyGroup grp1 = new MyGroup(); 102 grp1.name = "Group-1"; 103 MyGroup grp2 = new MyGroup(); 104 grp2.name = "Group-2"; 105 MyGroup grp3 = new MyGroup(); 106 grp3.name = "Group-3"; 107 // 108 Role r10 = new Role(); 109 r10.name = "role10"; 110 Role r11 = new Role(); 111 r11.name = "role11"; 112 // 113 User u10 = new User(); 114 u10.name = "Alex"; 115 u10.roles = [r10, r11]; 116 u10.group = grp3; 117 User u12 = new User(); 118 u12.name = "Arjan"; 119 u12.roles = [r10, r11]; 120 u12.group = grp2; 121 User u13 = new User(); 122 u13.name = "Wessel"; 123 u13.roles = [r10, r11]; 124 u13.group = grp2; 125 126 writeln("saving group 1-2-3" ); 127 sess.save( grp1 ); 128 sess.save( grp2 ); 129 sess.save( grp3 ); 130 writeln("Saving r10"); 131 sess.save(r10); 132 writeln("Saving r11"); 133 sess.save(r11); 134 writeln("Saving u10"); 135 sess.save(u10); 136 writeln("Saving u12"); 137 sess.save(u12); 138 writeln("Saving u13"); 139 sess.save(u13); 140 141 writeln("Loading User"); 142 // load and check data 143 auto qresult = sess.createQuery("FROM User WHERE name=:Name and some_field_with_underscore != 42").setParameter("Name", "Alex"); 144 writefln( "query result: %s", qresult.listRows() ); 145 User u11 = qresult.uniqueResult!User(); 146 //User u11 = sess.createQuery("FROM User WHERE name=:Name and some_field_with_underscore != 42").setParameter("Name", "Alex").uniqueResult!User(); 147 writeln("Checking User"); 148 assert(u11.roles.length == 2); 149 assert(u11.roles[0].name == "role10" || u11.roles.get()[0].name == "role11"); 150 assert(u11.roles[1].name == "role10" || u11.roles.get()[1].name == "role11"); 151 assert(u11.roles[0].users.length == 3); 152 assert(u11.roles[0].users[0] == u10); 153 154 //writeln("Removing User"); 155 // remove reference 156 //std.algorithm.remove(u11.roles.get(), 0); 157 //sess.update(u11); 158 159 // remove entity 160 //sess.remove(u11); 161 } 162 163 void main() 164 { 165 testHibernate(); 166 writeln("Press any key"); 167 readln(); 168 169 }