D 语言的 ORM 框架:HibernateD
jopen
9年前
HibernateD 是 D 语言的 ORM 框架,类似 Java 的 Hibernate,示例代码:
import hibernated.core; // Annotations of entity classes class User { long id; string name; Customer customer; @ManyToMany // cannot be inferred, requires annotation LazyCollection!Role roles; } class Customer { int id; string name; // Embedded is inferred from type of Address Address address; Lazy!AccountType accountType; // ManyToOne inferred User[] users; // OneToMany inferred this() { address = new Address(); } } @Embeddable class Address { string zip; string city; string streetAddress; } class AccountType { int id; string name; } class Role { int id; string name; @ManyToMany // w/o this annotation will be OneToMany by convention LazyCollection!User users; } // create metadata from annotations EntityMetaData schema = new SchemaInfoImpl!(User, Customer, AccountType, T1, TypeTest, Address, Role, GeneratorTest); // setup DB connection factory MySQLDriver driver = new MySQLDriver(); string url = MySQLDriver.generateUrl("localhost", 3306, "test_db"); string[string] params = MySQLDriver.setUserAndPassword("testuser", "testpasswd"); DataSource ds = ConnectionPoolDataSourceImpl(driver, url, params); // create session factory Dialect dialect = new MySQLDialect(); SessionFactory factory = new SessionFactoryImpl(schema, dialect, ds); scope(exit) factory.close(); // Create schema if necessary { // get connection Connection conn = ds.getConnection(); scope(exit) conn.close(); // create tables if not exist factory.getDBMetaData().updateDBSchema(conn, false, true); } // Now you can use HibernateD // create session Session sess = factory.openSession(); scope(exit) sess.close(); // use session to access DB // read all users using query Query q = sess.createQuery("FROM User ORDER BY name"); User[] list = q.list!User(); // create sample data Role r10 = new Role(); r10.name = "role10"; Role r11 = new Role(); r11.name = "role11"; Customer c10 = new Customer(); c10.name = "Customer 10"; User u10 = new User(); u10.name = "Alex"; u10.customer = c10; u10.roles = [r10, r11]; sess.save(r10); sess.save(r11); sess.save(c10); sess.save(u10); // load and check data User u11 = sess.createQuery("FROM User WHERE name=:Name"). setParameter("Name", "Alex").uniqueResult!User(); assert(u11.roles.length == 2); assert(u11.roles[0].name == "role10" || u11.roles.get()[0].name == "role11"); assert(u11.roles[1].name == "role10" || u11.roles.get()[1].name == "role11"); assert(u11.customer.name == "Customer 10"); assert(u11.customer.users.length == 1); assert(u11.customer.users[0] == u10); assert(u11.roles[0].users.length == 1); assert(u11.roles[0].users[0] == u10); // remove reference u11.roles.get().remove(0); sess.update(u11); // remove entity sess.remove(u11);