hibernate学习(二)

一、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进行保存更新操作,此外级联操作还有删除,与孤儿删除操作。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值