关于bean中属性作用域的问题。(隐藏 某些属性,同时希望能够通过hibernate抽上来)
有时候,我们不希望能够让某些属性暴露在外面,比方说书中的例子类Category。
public class Category {
private String name;
private Category parenteCategory;
private Set<Category> childCategories = new HashSet<Category>();
private Set<Item> items = new HashSet<Item>();
public void addChildCategory(Category childCategory){
if(childCategory==null){
throw new IllegalArgumentException("Null child category!");
}
if(childCategory.getParenteCategory()!=null){ //如果原父目录不为空,则在原副目录中删去子目录,
childCategory.getParenteCategory()
.getChildCategories()
.remove(childCategory);
}
childCategory.setParenteCategory(this);
this.childCategories.add(childCategory);
}
}
其不希望存放子目录的childCategories直接暴露给外面。就可以
用把其get,set方法设为私有,或者删除。书上说可以直接的字段访问进行持久化,这一点我还是看不太明白。估计以后会说吧。
在这里他绝少一个不错的方法,
返回只读的set和map。这个方法是Collections中的unmodifiableXXX,很不错的一个方法。
hibernate中的脏检查。
对于在hibernate中,对于某一个对象的
属性的改变,是
判断它的值,而不是统一性。所以获取方法的时候,返回一个不同的对象比返回由hibernate传递到设置方法的对象来的安全。
比方说下面的方法(返回User类的firstname属性)就
比较安全。
public String getFirstname(){
return new String(firstname);
}
这里我的理解是,如果要返回从hibernate抽上来的对象。那么如果这个返回对象改变。那么hibernate可能会自动的进行更新。比方说说这里的firstname。我返回出去之后,那么如果我改变这个值,hibernate也会更新。
但是对于
集合,则只是判断其统一性,而不是值的改变。
比如说下面的代码
需要尽量的避免。
public void setNames(List namesList){
names=(String[])namesList.toArray();
}
public List getNames(){
return Arrays.asList(names)
}
因为每次都会产生不同的对象,而使得统一性改变。
动态SQL语句生成。(SQL语句不显示所有的数据表的字段)
就是class标签中的dynamic-insert和dynamic-update语句。
这个时候生成的sql语句,只会出现需要更新的字段。(估计这东西到时候看看api就能了解个大概。只是会看不懂。)
使查询返回的实体(类)不可变。
class标签中的mutable属性。设置成false
这个属性个人觉得有点比较大的限制。毕竟一旦设置,那么一切也就没了。这个就有点太严谨了一点。
给查询实体命名。(重命名类的实体)
标签是:
<hibernate-mapping>
<import class="auction.model.Auditable" rename="IAuditable"/>
</hibernate-mapping>
以后的HQL查询的时候,直接输入IAuditable就好了。不过这个觉得比较奇怪,因为import标签没有说明给。
实现命名约定
比方说一个类User,而规约约定的是数据库表的前缀是db。那么数据库中对应的表应该是db_user。那么用了这个就可以在配置文件中直接写对应的表为user。
具体的用法是写一个类,继承ImprovedNamingStrategy或者实现NamingStrategy接口。然后调用Configuration中setNamingStrategy方法
这个方法觉得有点鸡肋。唯一的用处就是相同的对象要进入不同的表中的时候用到。但是用这个方法感觉很原始,首先,需要不创建不同的SessionFactory。其次,用继承也能起到差不多的效果,而且继承更加的方便。唯一的用处就是写映射文件的时候,方便一点了吧。
属性访问,衍生属性(计算值),默认属性等
看具体api吧,比较清楚一点。
映射组建
使用的是Component标签来进行。我发现如果要使用到parent子标签时,组件类当中要有一个属性,指向包含它的类。