@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
mappedBy: 1>只有OneToOne,OneToMany,ManyToMany上才有mappedBy属性,ManyToOne不存在该属性; 2>mappedBy标签一定是定义在被拥有方的,他指向拥有方; 3>mappedBy的含义,应该理解为,拥有方能够自动维护跟被拥有方的关系,当然,如果从被拥有方,通过手工强行来维护拥有方的关系也是可以做到的; 4>mappedBy跟joinColumn/JoinTable总是处于互斥的一方,可以理解为正是由于拥有方的关联被拥有方的字段存在,拥有方才拥有了被拥有方。mappedBy这方定义JoinColumn/JoinTable总是失效的,不会建立对应的字段或者表。 下面是一个例子: 人跟身份证双向关联 在Person里面定义的注解:
在person里面定义的注释代码
@OneToOne(cascade = CascadeTye.ALL,optional = true) public IDCard getIdCard(){ return idCard; }
在idcard里面定义的注释代码
@OneToOne(cascade = CascadeType.ALL,mappedBy = "idCard",optional = false) public Person getPerson(){ return person; }
有两个可选值:join和select 这个属性决定了你在查询的时候,是先查主表记录再查关联记录,还是要把关联表的记录一起查询出来。 select方式时先查询返回要查询的主体对象(列表),再根据关联外键id,每一个对象发一个select查询,获取关联的对象,形成n+1次查询 如果lazy=true(延迟加载),select在查询时只会查出主表记录,用到了关联数据时再自动在执行查询 而join方式,主体对象和关联对象用一句外键关联的sql同时查询出来,不会形成多次查询。
一对一 @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,也就是说,则个学生是没有班级的, 所以称该学生为孤儿节点,我们本应该要将他完全删除的,但是结果并不如我们所想的那样, 所以设置这个级联属性,就是为了删除这个孤儿节点。也就是解决这类情况。