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