ssh框架中对实体属性加注释生成表

1,基本属性

@Table

声明了该实体bean映射指定的表(table),目录(catalog)和schema名字

@Id

声明了该实体bean的标识属性(对应表中的主键)。

@Column

声明了属性到列的映射。该注解有如下的属性:

name 可选,列名(默认值是属性名)

unique 可选,是否在该列上设置唯一约束(默认值false)

nullable 可选,是否设置该列的值可以为空(默认值false)

insertable 可选,该列是否作为生成的insert语句中的一个列(默认值true)

updatable 可选,该列是否作为生成的update语句中的一个列(默认值true)

columnDefinition 可选,为这个特定列覆盖sql ddl片段(这可能导致无法在不同数据库间移植)

table 可选,定义对应的表(默认为主表)

length 可选,列长度(默认值255)

precision 可选,列十进制精度(decimal precision)(默认值0)

scale 可选,如果列十进制数值范围(decimal scale)可用,在此设置(默认值0)

@GeneratedValue

声明了主键的生成策略。该注解有如下属性:

strategy 指定生成的策略(JPA定义的),这是一个GenerationType。默认是GenerationType. AUTO

GenerationType.AUTO 主键由程序控制

GenerationType.TABLE 使用一个特定的数据库表格来保存主键

GenerationType.IDENTITY 主键由数据库自动生成(主要是自动增长类型)

GenerationType.SEQUENCE 根据底层数据库的序列来生成主键,条件是数据库支持序列。这个值要与generator一起使用,generator 指定生成主键使用的生成器(可能是orcale中的序列)。

GenericGenerator

声明了一个hibernate的主键生成策略。支持十三种策略。该注解有如下属性:

name 指定生成器名称,它被应用于@GeneratedValue的generator的值。

strategy 指定具体生成器的类名(指定生成策略)。

parameters 得到strategy指定的具体生成器所用到的参数。

@Transient

声明了非持久化属性,即数据库中没有相应的映射字段,是一个普通属性。

@Temporal

声明了日期类型。

TemporalType.DATE 日期,例:2011-04-12

TemporalType.TIME 时间,例:22:50:30

TemporalType.TIMESTAMP 日期和时间,例:2011-04-12 22:51:30

 

2 mappedBy详解

mappedBy: 
1>只有OneToOne,OneToMany,ManyToMany上才有mappedBy属性,ManyToOne不存在该属性; 
2>mappedBy标签一定是定义在被拥有方的,他指向拥有方; 
3>mappedBy的含义,应该理解为,拥有方能够自动维护跟被拥有方的关系,当然,如果从被拥有方,通过手工强行来维护拥有方的关系也是可以做到的; 
4>mappedBy跟joinColumn/JoinTable总是处于互斥的一方,可以理解为正是由于拥有方的关联被拥有方的字段存在,拥有方才拥有了被拥有方。mappedBy这方定义JoinColumn/JoinTable总是失效的,不会建立对应的字段或者表。 

下面是一个例子: 
   人跟身份证双向关联 
   在Person里面定义的注解: 

在person里面定义的注释代码 

 收藏代码

  1. @OneToOne(cascade = CascadeTye.ALL,optional = true)  
  2. public IDCard getIdCard(){  
  3.    return idCard;  
  4. }  


注意:在对应关系中mappedBy属性只用在拥有方

在idcard里面定义的注释代码 

 收藏代码

  1. @OneToOne(cascade = CascadeType.ALL,mappedBy = "idCard",optional = false)  
  2. public Person getPerson(){  
  3.    return person;  
  4. }  

 

3 Hibernate映射文件中fetch属性的含义

有两个可选值:join和select
这个属性决定了你在查询的时候,是先查主表记录再查关联记录,还是要把关联表的记录一起查询出来。

select方式时先查询返回要查询的主体对象(列表),再根据关联外键id,每一个对象发一个select查询,获取关联的对象,形成n+1次查询
如果lazy=true(延迟加载),select在查询时只会查出主表记录,用到了关联数据时再自动在执行查询

而join方式,主体对象和关联对象用一句外键关联的sql同时查询出来,不会形成多次查询。

4 表之间的关系示例

一对一
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "THEMEID") //指定外键
@Cascade({CascadeType.ALL})
private BasTsTheme basTsTheme;

一对多
@OneToMany( fetch = FetchType.LAZY, mappedBy = "basTsGrade")
@Cascade({CascadeType.DELETE_ORPHAN,CascadeType.SAVE_UPDATE})
private Set<BasTsUser> basTsUsers = new HashSet<BasTsUser>(0);


多对一
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "GRADEID")
@Cascade({CascadeType.SAVE_UPDATE})
private BasTsGrade basTsGrade;


多对多
@ManyToMany( fetch = FetchType.LAZY, mappedBy = "basTsRoles")
@Cascade({CascadeType.DELETE_ORPHAN,CascadeType.SAVE_UPDATE})
private Set<BasTsUser> basTsUsers = new HashSet<BasTsUser>(0);

@ManyToMany( fetch = FetchType.LAZY)
@JoinTable(name = "BAS_TR_ROLEUSER", schema = "DESK", joinColumns = { @JoinColumn(name = "USERID", nullable = false, updatable = false) }, inverseJoinColumns = { @JoinColumn(name = "ROLEID", nullable = false, updatable = false) })
@Cascade({ CascadeType.DELETE_ORPHAN, CascadeType.SAVE_UPDATE })
private Set<BasTsRole> basTsRoles;
cascade(级联)
        级联,就是对一个对象进行操作的时候,会把他相关联的对象也一并进行相应的操作
        cascade关系有以下几种:
          all: 所有情况下均进行关联操作,即save-update和delete。
          none: 所有情况下均不进行关联操作。这是默认值。 
          save-update: 在执行save/update/saveOrUpdate时进行关联操作。 
          delete: 在执行delete 时进行关联操作。
          all-delete-orphan: 当一个节点在对象图中成为孤儿节点时,删除该节点
          其他应该度知道,说一下这个all-delete-orphan:什么是孤儿节点,举个例子,班级和学生,
          一张classes表,一张student表,student表中有5个学生的数据,其5个学生都属于这个班级,
          也就是这5个学生中的外键字段都指向那个班级,现在删除其中一个学生(remove),进行的数据
          操作仅仅是将student表中的该学生的外键字段置为null,也就是说,则个学生是没有班级的,
          所以称该学生为孤儿节点,我们本应该要将他完全删除的,但是结果并不如我们所想的那样,
          所以设置这个级联属性,就是为了删除这个孤儿节点。也就是解决这类情况。
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值