Hibernate Application Context xml hibernate cfg xml ooadooad
配置 • Hibernate. Application. Context. xml • hibernate. cfg. xml • 创建数据库 – ooad/ooad • 关于Library/Project模板
Class mapping • 创建类Teacher及属性name/birthday @Test public void create. Teacher. Test() { Teacher teacher = new Teacher(); teacher. set. Name("student 1"); teacher. set. Birthday(new Date()); get. Persistence. Manager(). save(teacher); • 基类的用途 • 修改Hibernate. cfg. xml • 第一次运行: – 看DB Schema } assert. Object. Persisted(teacher); • 修改Rollback属性,再次运行 – 看DB数据 • SQL输出日志说明
Datatype/enum Mapping • 自定义属性的映射: Address{postcode, addrinfo},观察Schema自 动更新 @Test public void create. Teacher. With. Attribute() { Teacher teacher = new Teacher(); teacher. set. Name("teacher 1"); teacher. set. Birthday(new Date()); teacher. get. Address(). set. Post. Code("200433"); teacher. set. Gender(Gender. female); get. Persistence. Manager(). save(teacher); assert. Object. Persisted(teacher); } Teacher saved. Teacher = get. Persistence. Manager(). get(Teacher. class, teacher. get. Id()); assert. Equals(teacher, saved. Teacher); assert. Equals(teacher. get. Gender(), saved. Teacher. get. Gender());
• @Enumerated(Enum. Type. STRING) – Delete all tables:因为Schema有时无法自动更 新 • Check database schema
Simple HQL @Test public void find. Teacher. By. HQL() { Teacher teacher = new Teacher(); teacher. set. Name("teacher 1"); teacher. set. Birthday(new Date()); teacher. get. Address(). set. Post. Code("200433"); teacher. set. Gender(Gender. female); get. Persistence. Manager(). save(teacher); String find. Teacher. HQL = "from Teacher t where t. name like 't%'" + " and t. address. post. Code = '200433'"; Query hql = get. Persistence. Manager(). create. Query(find. Teacher. HQL); } assert. Equals(1, hql. list(). size());
Inheritance Mapping • 继承的映射方式:单表映射 • Create abstract course class, and it’s @Entity subclasses; @Inheritance(strategy = Inheritance. Type. SINGLE_TABLE) @Discriminator. Column(name = "COURSETYPE") public abstract class Course extends Base. Model. Object { @Basic String name; @Basic Integer total. Students; @Entity @Discriminator. Value("NORMAL") public class Normal. Course extends Course {
Inheritance Mapping • 测试代码:创建两个不同类型的Course, 查看DB Schema,Rollback(false),运行后查看数据 Normal. Course normal. Course = new Normal. Course(); normal. Course. set. Name("normal course"); normal. Course. set. Total. Students(10); normal. Course. set. Classroom. Name("S 209"); get. Persistence. Manager(). save(normal. Course); assert. Object. Persisted(normal. Course); Online. Course online. Course = new Online. Course(); online. Course. set. Name("online course"); online. Course. set. Total. Students(200); online. Course. set. URL("http: //www. course. com/test"); get. Persistence. Manager(). save(online. Course); assert. Object. Persisted(online. Course);
Inheritance Mapping • 测试代码如下,在运行前分析是否能通过: 测试代码的副作用的危害。 String hsql 1 = "from Course"; List hsql 1 Result = get. Persistence. Manager(). create. Query(hsql 1). list(); assert. Equals(2, hsql 1 Result. size()); String hsql 2 = "from Normal. Course"; hsql 1 Result = get. Persistence. Manager(). create. Query(hsql 2). list(); assert. Equals(1, hsql 1 Result. size());
Association Mapping • 对于数据库设计来说,一对多/多对一的实现方法。 • 修改Course的构造函数,增加Teacher作为参数。 • 在Teacher中增加create. XXXCourse方法。 • 对于没有级联的情况,实现如下 @One. To. Many(mapped. By = “teacher”) private Collection<Course> courses = new Array. List<Course>(); @Many. To. One Teacher teacher;
Association Mapping • 没有级联的情况的测试代码: @Test public void association. Create. Test() { Teacher teacher = new Teacher("ztg"); get. Persistence. Manager(). save(teacher); Course course 1 = teacher. create. Normal. Course("ooad"); get. Persistence. Manager(). save(course 2); Course course 2 = teacher. create. Online. Course("software test"); get. Persistence. Manager(). save(course 3); assert. Equals(2, teacher. get. Courses(). size()); }
Association Mapping • 期望: public void association. Cascade. Create. Test() { Teacher teacher = new Teacher("ztg"); teacher. create. Normal. Course("ooad 07"); teacher. create. Normal. Course("ooad 08"); teacher. create. Online. Course("software test"); get. Persistence. Manager(). save(teacher); assert. Equals(3, teacher. get. Courses(). size()); } • 设定级联 @One. To. Many(mapped. By = "teacher", cascade = { Cascade. Type. ALL }) private Collection<Course> courses = new Array. List<Course>();
Association Mapping • 级联删除测试 @Test @Rollback(false) public void association. Cascade. Delete. Test() { for (Teacher teacher : get. Persistence. Manager(). all(Teacher. class)) { get. Persistence. Manager(). delete(teacher); } }
- Slides: 14