最近接触到一款JAVA开源软件(shop++)这是一款电商软件。然后看了这款软件的源代码,发现真的很强大。框架采用的是spring mvc + hibernate + freemarker ,代码结构层次分明,代码封装和重用性也很高。非常适合二次开发。其次重点说说hibernate 注解吧 数据库表采用的是hibernate注解映射的方式。然后略微研究了下,分享一下自己的见解。
@Entity
说明此类是一个实体映射
@Table
table用来定义entity主表的name,cataloh,schema属性。
name:表名
catalog:对应关系数据库中的catalog
schema:对应关系数据库中的schema
@Column
name:列名
unique:是否唯一
nullable:是否允许为空
insertable:是否允许插入
updatable:是否允许更新
@JoinColumn
如果在entity class 的field上定义了关系(一对一 、一对多等)我们就通过joinColumn来定义关系的属性。JoinColumnde 的大部分属性和Column类似.
name:列名
unique:是否唯一
nullable:是否允许为空
insertable:是否允许插入
updatable:是否允许更新
@Transient
transient用来注释entity的属性,指定的这些属性不会被持久化,也不会为这些属性建表
@OrderBy
在一对多,多对多的关系中,有时我们希望从数据库加载出来的集合对象是按一定方式排序的,这可以通过OrderBy来实现,默认是按对象的主键升序排列
@JoinTable(name="xx_article_tag")
说明数据源(数据表),来之于那个数据库
一对一关系映射:
售后服务(customer)---------------订单表(order)
在售后服务一端配置
private Order order
@NotNull
@JoinColumn(name = "order_id", nullable = false, updatable = false)// 在售后表中配置一个订单ID 不能为空 不能修改
@OneToOne
在订单表一端配置
private Customer customer
@OneToOne( cascade = CascadeType.REMOVE, mappedBy = "order") // 级联影响删除操作,被映射于“order”
一对多关系映射:
文章(article)----------文章分类(articleCategory)
在文章一端配置
private ArticleCategory articleCategory
@NotNull
@ManyToOne(fetch = FetchType.LAZY)//设置抓取策略:LAZY为延迟加载
@JoinColumn(nullable = false)
在文章分类一端配置
private Set<Article> articles = new HashSet<Article>()
@OneToMany(mappedBy = "articleCategory", fetch = FetchType.LAZY)
mappedBy :
1、只有配置了OneToOne,OneToMany,ManyToMany的一方才有mappedBy属性
2、mappedBy标签一定是定义在被拥有方的,他指向拥有方
3、mappedBy跟joinColumn/joinTable总是处于互斥的一方,也可以理解为正是由于拥有方的关联被拥有方的字段存在,拥有方才拥有了被拥有方。mappedBy这方定义的joinColumn/joinTable总是失效的,不会建立对应的字段或者表;
多对多关系映射:
标签(tag)---------------文章(article)
在标签一端配置
private Set<Article> articles = new HashSet<Article>()
@ManyToMany(mappedBy = "tags", fetch = FetchType.LAZY)
在文章一端配置
private Set<Tag> tags = new HashSet<Tag>()
@ManyToMany(fetch = FetchType.LAZY)//抓取方式为延迟加载
@JoinTable(name = "xx_article_tag")//说明数据源,来之于那个数据表
@OrderBy("order asc")//asc:按照主键升序假设来排列,此处的order asc是由程序内部方法定义的。
转载于:https://blog.51cto.com/10692499/1691935