一、hibernate类型系统
hibernate类型系统分为3类:实体、值类型和映射类型
实体:实体类型具有标识符属性的类,可能处于三种周期状态:瞬时、托管,持久化。
值类型:不具有标识符属性,其生命周期完全有自己的实体实例的生命周期决定。
二、映射集合和实体关联
1.值类型的映射关系:set、bag、list和map
(1)Set
@org.hibernate.annotations.CollectionOfElements(targetElement = java.lang.String.class) @JoinTable( name = "ITEM_IMAGE", joinCloumns = @JoinColumn(name = "ITEM_ID")) @Column(name = "FILENAME", nullable =false) private Set<String> images = new HashSet<String>(); ...
在这里集合表ITEM_IMAGE有两个列,一起形成复合主键,这里使用了泛型代码,所有targetElement在这里可以省略。
(2)List
@org.hibernate.annotations.CollectionOfElements @JoinTable( name = "ITEM_IMAGE", joinColumns = @JoinColumn(name = "ITEM_ID") ) @org.hibernate.annotations.IndexColumn( name = "POSTION", base = 1 ) @Column private List<String> images = new ArrayList<String>(); ...
(3)Bag
将上面的IndexColumn注解去掉,就会被当做包集合处理。但这样做,可能使客户端认为集合元素的顺序需要保存着,所以最好将List替换为Collection
(4)Map
@org.hibernate.annotations.CollectionOfElements @JoinTable( name ="ITEM_IMAGE", joinColumns =@JoinColumn(name = "ITEM_ID") ) @org.hibernate.annotationsMapKey( columns = @Column(name = "IMAGENAME") ) @Column(name = "FILENAME") private Map<String, String> images = new HashMap<String, String>(); ...
(5)排序集合与有序集合
@org.hibernate.annotations.Collections.CollectionsOfElements @JoinTable( name = "ITEM_IMAGE", joinColumns = @JoinColumn(name ="ITEM_ID") ) @column(name ="FILENAME, nullable = false) @org.hibernate.annotation.sort( type = org.hibernate.annotations.SortType.NATUAL ) private SortedSet<String> images = new TreeSet<String>(); ...
@org.hibernate.annotations.CollectionOfElements @JoinTable( name = "ITEM_IMAGE", joinColumns = @JoinColumn(name = "ITEM_ID") ) @Column(name = "FILENAME", nullable = false) @org.hibernate.annotations.OrderBy( clause = "FILENAME asc" ) private Set<String> images = new HashSet<String>(): ...
排序集合指用一个Java比较器在内存中进行排序,而有序集合指用一个 order by 子句 的SQL查询在数据库级中排列。
2.组件集合。
组件类由于没有标识符,所以必须实现equals()和hashCode();可以再组件类上添加@Embeddable来启用注解
@Embedable public class Image{ @org.hibernate.annotations.Parent Item item; @Column(null = false) private String name; .... }
由于集合表中所有的列都为复合组件,所以这些列为not null 很重要,可以再集合表中添加代理主键,来使得某些列可以为空
@org.hibernate.annotations.CollectionsOfElements @JoinTable( name = "ITEM_IMAGE", joinColumns = @Column(name = "ITEM_ID") ) @CollectionId( column = @Column(name = "ITEM_IMAGE_ID"), type = org.hibernate.annotations.Type(type = "long"), generator = "sequence" ) private Collection<Image> image = new ArrayList<Image>(); ...
3.映射父子关系
(1)多对一关联映射
Public class Bid{ ... @ManyToOne(targetEntity = auction.mode.Item.class) @JoinColumn(name ="ITEM_ID", nullable = fasle) private Item item; ... }
@ManyToOne注解的位置有@Id注解的位置决定。
(2)一对多
onetomany表明集合没有包含值类型的实例,而是包含对实体实例的引用。考虑这种情况,同一个外键值有两个不同内存表示方法,eg:
bid.setItem(item); bids.add(bid);
以上代码hibernate会试图执行两个不同的SQL语句,更新同一个外键列,我们可以通过注解指定那一端的变化不与数据库同步。
public class Item{ ... @OneToMany(mappedBy = "item") private set<Bid> bids = new HashSet<Bid>(): ... }
mappedBy属性必须指定目标实体的反向属性,此时只修改bids,不会同步到数据库。
3.级联操作
public class Item{ @OneToMany( cascadeType ={CascadeType.PERSIST, CascadeType.MERGE}, mapedBy = “item” ) private Set<Bid> bids = new HashSet<Bid>(): ... }
对Item进行保存更新操作,同时也会对Bid进行保存更新操作,此外级联操作还有删除,与孤儿删除操作。