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