软件的模型:
概念模型(软件分析阶段)–描述实体
域模型(面向对象)(软件设计阶段):包括具有状态和行为的域对象,域对象之间的关系
域对象(包括实体域对象(应用的业务数据在内存中的表现形式)(如实体EJB、POJO类)、过程域对象(用于执行业务逻辑)、事件域对象)
域对象之间有关联、依赖、聚集、继承四种关系
数据模型(面向关系)–描述关系数据的静态结构(关系数据库学的最重要的一个理论就是:不要给关键字赋予任何业务意义,请使用代理主键)
HQL语句针对的是hbm.xml文件中出现的property而不是针对pojo中的property,也不是针对数据库中的表的字段。
建议数据库的表名以及字段名的所有字符都为大写,表名以”S”结尾,而对应的实体类名为表名的全小写,同时去掉尾部的”S”和首字母大写
为了实现这样的效果,可以实现Hibernate的NamingStrategy接口,然后在Configuration config = new Configuration().configure(String yourxml);
config.setNamingStrategy(new YourNamingStrategy);
Java语言按内存地址来识别或区分同一个类的不同对象,而关系数据库按主键值来识别或区分同一个表的不同记录。Hibernate使用对象标识符(OID)来建立内存中的对象和数据库表中记录的对应关系,对象的OID和数据库表的主键对应。
应该把含有Set方的inverse设置为true,不让它去更新与它关联的Set里的类实例,而把它作为一个镜像,Hibernate仅按照Set里对应的某方去同步更新数据库,但注意一点:建立两个对象的双向关联时,在程序中应该同时修改关联的对象的相应属性,避免受Hibernate的影响
对于需要被持久化的Java对象,在它的生命周期中,可处于三种状态:
1.临时状态(transient):刚刚用new语句创建,还没有被持久化,不处于Session缓存中
特征:不处于Session的缓存中,也可以说,不被任何一个Session实例关联
在数据库中没有对应的记录
2.持久化状态(persistent):已经被持久化,加入到Session的缓存中
特征:位于一个Session实例的缓存中,也可以说,持久化对象总是被一个Session实例关联
与数据库中的相关记录对应
Session在清理缓存时,会根据持久化对象的属性变化来同步更新数据库
3.游离状态(detached):已经被持久化,但不再处于Session的缓存中
特征:不处于Session的缓存中,也可以说,不被任何一个Session实例关联
游离对象是由持久化对象转变过来的,因此在数据库中有可能还存在与它对应的记录(如果没有其它程序删除了那条记录)
关于cascade属性
none:在保存、更新或删除当前对象时,忽略其他关联的对象。它是cascade属性的默认值
save-update:当通过Session的save()、update以及saveOrUpdate()方法来保存或更新当前对象时,级联保存所有关联的新建的临时对象,并且级联更新所有关联的游离对象
delete:当通过Session的delete()方法删除当前对象时,级联删除所有关联的对象
all:包含save-update以及delete的行为。此外,对当前对象执行evict()或lock()操作时,也会对所有关联的持久化对象执行evict()或lock()操作
delete-orphan:删除所有和当前对象解除关联关系的对象
all-delete-orphan:包含all和delete-orphan的行为