一. 使用Hibernate的步骤:
1. Hibernate的Jar包导入
2. 创建实体类,完成映射。必须要有@Entity。
3. 创建DAO,(必要的话,使用既存的BaseDAO),必须有@Repository("DAO")才可以自动注入。
4. 在Spring的配置文件ApplicationContext.xml中,添加Entity和DAO自动装配时,需要扫描的目录:
Entity:
<bean id="sessionFactory" ...>
...
<property name="packagesToScan">
<list>
...
<value>com.sun.project</value>
</list>
</property>
</bean>
DAO(或其他任何自动装配的组件):
<Context:component-scan base-package="org.sun.com" />
5. 在逻辑层使用:
声明:
@Resource //自动注入,找到@Repository("SunNewDao")并自动注入。
SunNewDao sunNewDao;
使用:
List<SunNewEntity> sunNewList = sunNewDao.findById(...);
二. DiscriminatorColumn:
Entity可以用@DiscriminatorColumn来设置数据的区分列。
默认为"DTYPE"列,且必须跟@DiscriminatorOptions一起用。
其他Entity设置@DiscriminatorValue("...")来取得DiscriminatorColumn的区分。
* 但是@DiscriminatorValue和@Table同时使用时,好像有点问题,仍然先会取得所有DTYPE的数据,因此建议在子类(extends)使用。
比如,Select表数据时,好像不是先根据@DiscriminatorValue取得@Table的数据后,再做Select。
而是先Select表数据后,再根据@DiscriminatorValue返回值。
三. Hibernate中的类继承:
如果有子类继承父类的Entity,则在做级联检索时,关联了父类的表的话,会自动Left Join出所有子类的Entity。
例:
父类:Course
子类:SunCourse extends Course
当Student表与Course表关联后,也会自动关联SunCourse。
如果执行检索操作,取得Course以后,实际得到的是SunCOurse。
以下是把父类Course转化为子类SunCourse的方法:
If (Course instanceof SunCourse){
SunCourse sun = (SunCOurse)Course;
}
四. 非主键列的关联:
级联的Annotation的定义中,如果想关联非主键列,则需要使用下列写法:
// codeid是非主键列
@JoinColumn(name="unit_id", referencedColumnName="codeid", insertable=false, updatable=false)
@ManyToOne(targetEntity=UnitTypeEntity.class, cascade={javax.persistence.CascadeType.MERGE, javax.persistence.CascadeType.PERSIST})
Private UnitTypeEntity unit;
五. @Resource和@Autowired的作用和区别:
作用相同,都是自动注入。
@Resource是按ByName自动注入。
@Autowired是按ByTpye自动注入。
如果既不指定name,也不指定type,则使用byName自动注入策略。