1 module embeddedtest;
2 
3 import hibernated.core;
4 
5 import testrunner : BeforeClass, Test, AfterClass, runTests;
6 import hibernatetest : HibernateTest;
7 
8 @Embeddable
9 class Address {
10   string street;
11   string city;
12 }
13 
14 class Customer {
15   @Id @Generated
16   long cid;
17 
18   string name;
19 
20   Address shippingAddress;
21 
22   @Embedded("billing")
23   Address billingAddress;
24 }
25 
26 class EmbeddedTest : HibernateTest {
27   override
28   EntityMetaData buildSchema() {
29     return new SchemaInfoImpl!(Customer, Address);
30   }
31 
32   @Test("embedded.creation")
33   void creationTest() {
34     Session sess = sessionFactory.openSession();
35     scope(exit) sess.close();
36 
37     Customer c1 = new Customer();
38     c1.name = "Kickflip McOllie";
39     c1.shippingAddress = new Address();
40     c1.shippingAddress.street = "1337 Rad Street";
41     c1.shippingAddress.city = "Awesomeville";
42     c1.billingAddress = new Address();
43     c1.billingAddress.street = "101001 Robotface";
44     c1.billingAddress.city = "Lametown";
45 
46     long c1Id = sess.save(c1).get!long;
47     assert(c1Id > 0);
48   }
49 
50   @Test("embedded.read")
51   void readTest() {
52     Session sess = sessionFactory.openSession();
53     scope(exit) sess.close();
54 
55     auto r1 = sess.createQuery("FROM Customer WHERE shippingAddress.city = :City")
56         .setParameter("City", "Awesomeville");
57     Customer c1 = r1.uniqueResult!Customer();
58     assert(c1 !is null);
59     assert(c1.shippingAddress.street == "1337 Rad Street");
60 
61     auto r2 = sess.createQuery("FROM Customer WHERE billingAddress.city = :City")
62         .setParameter("City", "Lametown");
63     Customer c2 = r2.uniqueResult!Customer();
64     assert(c2 !is null);
65     assert(c2.billingAddress.street == "101001 Robotface");
66   }
67 
68   @Test("embedded.update")
69   void updateTest() {
70     Session sess = sessionFactory.openSession();
71 
72     auto r1 = sess.createQuery("FROM Customer WHERE billingAddress.city = :City")
73         .setParameter("City", "Lametown");
74     Customer c1 = r1.uniqueResult!Customer();
75     assert(c1 !is null);
76 
77     c1.billingAddress.street = "17 Neat Street";
78     sess.update(c1);
79 
80     // Create a new session to prevent caching.
81     sess.close();
82     sess = sessionFactory.openSession();
83 
84     r1 = sess.createQuery("FROM Customer WHERE billingAddress.city = :City")
85         .setParameter("City", "Lametown");
86     c1 = r1.uniqueResult!Customer();
87     assert(c1 !is null);
88     assert(c1.billingAddress.street == "17 Neat Street");
89 
90     sess.close();
91   }
92 
93   @Test("embedded.delete")
94   void deleteTest() {
95     Session sess = sessionFactory.openSession();
96 
97     auto r1 = sess.createQuery("FROM Customer WHERE billingAddress.city = :City")
98         .setParameter("City", "Lametown");
99     Customer c1 = r1.uniqueResult!Customer();
100     assert(c1 !is null);
101 
102     sess.remove(c1);
103 
104     // Create a new session to prevent caching.
105     sess.close();
106     sess = sessionFactory.openSession();
107 
108     r1 = sess.createQuery("FROM Customer WHERE billingAddress.city = :City")
109         .setParameter("City", "Lametown");
110     c1 = r1.uniqueResult!Customer();
111     assert(c1 is null);
112 
113     sess.close();
114   }
115 
116 }