D 語言的 ORM 框架:HibernateD

jopen 9年前發布 | 17K 次閱讀 持久層框架 HibernateD

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);</pre>

項目主頁:http://www.baiduhome.net/lib/view/home/1434269154781

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!