Hibernate注释大全收藏.docx
- 文档编号:9381765
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:37
- 大小:25.28KB
Hibernate注释大全收藏.docx
《Hibernate注释大全收藏.docx》由会员分享,可在线阅读,更多相关《Hibernate注释大全收藏.docx(37页珍藏版)》请在冰豆网上搜索。
Hibernate注释大全收藏
Hibernate注释大全收藏
声明实体Bean
@Entity
publicclassFlightimplementsSerializable{
Longid;
@Id
publicLonggetId(){returnid;}
publicvoidsetId(Longid){this.id=id;}
}
@Entity注解将一个类声明为实体Bean,@Id注解声明了该实体Bean的标识属性。
Hibernate可以对类的属性或者方法进行注解。
属性对应field类别,方法的getXxx()对应property类别。
定义表
通过@Table为实体Bean指定对应数据库表,目录和schema的名字。
@Entity
@Table(name="tbl_sky")
publicclassSkyimplementsSerializable{
...
@Table注解包含一个schema和一个catelog属性,使用@UniqueConstraints可以定义表的唯一约束。
@Table(name="tbl_sky",
uniqueConstraints={@UniqueConstraint(columnNames={"month","day"})}
)
上述代码在"month"和"day"两个field上加上uniqueconstrainst.
@Version注解用于支持乐观锁版本控制。
@Entity
publicclassFlightimplementsSerializable{
...
@Version
@Column(name="OPTLOCK")
publicIntegergetVersion(){...}
}
version属性映射到"OPTLOCK"列,entitymanager使用这个字段来检测冲突。
一般可以用数字或者timestamp类型来支持version.
实体Bean中所有非static非transient属性都可以被持久化,除非用@Transient注解。
默认情况下,所有属性都用@Basic注解。
publictransientintcounter;//transientproperty
privateStringfirstname;//persistentproperty
@Transient
StringgetLengthInMeter(){...}//transientproperty
StringgetName(){...}//persistentproperty
@Basic
intgetLength(){...}//persistentproperty
@Basic(fetch=FetchType.LAZY)
StringgetDetailedComment(){...}//persistentproperty
@Temporal(TemporalType.TIME)
java.util.DategetDepartureTime(){...}//persistentproperty
@Enumerated(EnumType.STRING)
StarredgetNote(){...}//enumpersistedasStringindatabase
上述代码中counter,lengthInMeter属性将忽略不被持久化,而firstname,name,length被定义为可持久化和可获取的。
@TemporalType.(DATE,TIME,TIMESTAMP)分别Mapjava.sql.(Date,Time,Timestamp).
@Lob注解属性将被持久化为Blog或Clob类型。
具体的java.sql.Clob,Character[],char[]和java.lang.String将被持久化为Clob类型.java.sql.Blob,Byte[],byte[]和serializabletype将被持久化为Blob类型。
@Lob
publicStringgetFullText(){
returnfullText;//clobtype
}
@Lob
publicbyte[]getFullCode(){
returnfullCode;//blogtype
}
@Column注解将属性映射到列。
@Entity
publicclassFlightimplementsSerializable{
...
@Column(updatable=false,name="flight_name",nullable=false,length=50)
publicStringgetName(){...}
定义name属性映射到flight_namecolumn,notnull,can'tupdate,lengthequal50
@Column(
name="columnName";
(1)列名
booleanunique()defaultfalse;
(2)是否在该列上设置唯一约束
booleannullable()defaulttrue;(3)列可空?
booleaninsertable()defaulttrue;(4)该列是否作为生成insert语句的一个列
booleanupdatable()defaulttrue;(5)该列是否作为生成update语句的一个列
StringcolumnDefinition()default"";(6)默认值
Stringtable()default"";(7)定义对应的表(deault是主表)
intlength()default255;(8)列长度
intprecision()default0;//decimalprecision(9)decimal精度
intscale()default0;//decimalscale(10)decimal长度
嵌入式对象(又称组件)也就是别的对象定义的属性
组件类必须在类一级定义@Embeddable注解。
在特定的实体关联属性上使用@Embeddable和@AttributeOverride注解可以覆盖该属性对应的嵌入式对象的列映射。
@Entity
publicclassPersonimplementsSerializable{
//Persistentcomponentusingdefaults
AddresshomeAddress;
@Embedded
@AttributeOverrides({
@AttributeOverride(name="iso2",column=@Column(name="bornIso2")),
@AttributeOverride(name="name",column=@Column(name="bornCountryName"))
})
CountrybornIn;
...
}
@Embeddable
publicclassAddressimplementsSerializable{
Stringcity;
Countrynationality;//nooverridinghere
}
@Embeddable
publicclassCountryimplementsSerializable{
privateStringiso2;
@Column(name="countryName")privateStringname;
publicStringgetIso2(){returniso2;}
publicvoidsetIso2(Stringiso2){this.iso2=iso2;}
publicStringgetName(){returnname;}
publicvoidsetName(Stringname){this.name=name;}
...
}
Person类定义了Address和Country对象,具体两个类实现见上。
无注解属性默认值:
?
属性为简单类型,则映射为@Basic
?
属性对应的类型定义了@Embeddable注解,则映射为@Embedded
?
属性对应的类型实现了Serializable,则属性被映射为@Basic并在一个列中保存该对象的serialized版本。
?
属性的类型为java.sql.Cloborjava.sql.Blob,则映射到@Lob对应的类型。
映射主键属性
@Id注解可将实体Bean中某个属性定义为主键,使用@GenerateValue注解可以定义该标识符的生成策略。
?
AUTO-可以是identitycolumn,sequence或者table类型,取决于不同底层的数据库
?
TABLE-使用table保存id值
?
IDENTITY-identitycolumn
?
SEQUENCE-seque
nce
@Id@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="SEQ_STORE")
publicIntegergetId(){...}
@Id@GeneratedValue(strategy=GenerationType.IDENTITY)
publicLonggetId(){...}
AUTO生成器,适用与可移值的应用,多个@Id可以共享同一个identifier生成器,只要把generator属性设成相同的值就可以。
通过@SequenceGenerator和@TableGenerator可以配置不同的identifier生成器。
table="GENERATOR_TABLE" pk-column-name="key" value-column-name="hi" pk-column-value="EMP" allocation-size="20"/> //andtheannotationequivalent @javax.persistence.TableGenerator( name="EMP_GEN", table="GENERATOR_TABLE", pkColumnName="key", valueColumnName="hi" pkColumnValue="EMP", allocationSize=20 ) sequence-name="my_sequence" allocation-size="20"/> //andtheannotationequivalent @javax.persistence.SequenceGenerator( name="SEQ_GEN", sequenceName="my_sequence", allocationSize=20 ) Thenextexampleshowsthedefinitionofasequencegeneratorinaclassscope: @Entity @javax.persistence.SequenceGenerator( name="SEQ_STORE", sequenceName="my_sequence" ) publicclassStoreimplementsSerializable{ privateLongid; @Id@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="SEQ_STORE") publicLonggetId(){returnid;} } Store类使用名为my_sequence的sequence,并且SEQ_STORE生成器对于其他类是不可见的。 通过下面语法,你可以定义组合键。 ? 将组件类注解为@Embeddable,并将组件的属性注解为@Id ? 将组件的属性注解为@EmbeddedId ? 将类注解为@IdClass,并将该实体中所有主键的属性都注解为@Id @Entity @IdClass(FootballerPk.class) publicclassFootballer{ //partoftheidkey @IdpublicStringgetFirstname(){ returnfirstname; } publicvoidsetFirstname(Stringfirstname){ this.firstname=firstname; } //partoftheidkey @IdpublicStringgetLastname(){ returnlastname; } publicvoidsetLastname(Stringlastname){ this.lastname=lastname; } publicStringgetClub(){ returnclub; } publicvoidsetClub(Stringclub){ this.club=club; } //appropriateequals()andhashCode()implementation } @Embeddable publicclassFootballerPkimplementsSerializable{ //samenameandtypeasinFootballer publicStringgetFirstname(){ returnfirstname; } publicvoidsetFirstname(Stringfirstname){ this.firstname=firstname; } //samenameandtypeasinFootballer publicStringgetLastname(){ returnlastname; } publicvoidsetLastname(Stringlastname){ this.lastname=lastname; } //appropriateequals()andhashCode()implementation } @Entity @AssociationOverride(name="id.channel",joinColumns=@JoinColumn(name="chan_id")) publicclassTvMagazin{ @EmbeddedIdpublicTvMagazinPkid; @Temporal(TemporalType.TIME)Datetime; } @Embeddable publicclassTvMagazinPkimplementsSerializable{ @ManyToOne publicChannelchannel; publicStringname; @ManyToOne publicPresenterpresenter; } 映射继承关系 EJB支持3种类型的继承。 ? TableperClassStrategy: the ? SingleTableperClassHierarchyStrategy: the ? JoinedSubclassStrategy: the @Inheritance注解来定义所选的之类策略。 每个类一张表 @Entity @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) publicclassFlightimplementsSerializable{ 有缺点,如多态查询或关联。 Hibernate使用SQLUnion查询来实现这种策略。 这种策略支持双向的一对多关联,但不支持IDENTIFY生成器策略,因为ID必须在多个表间共享。 一旦使用就不能使用AUTO和IDENTIFY生成器。 每个类层次结构一张表 @Entity @Inheritance(strategy=InheritanceType.SINGLE_TABLE) @DiscriminatorColumn( name="planetype", discriminatorType=DiscriminatorType.STRING ) @DiscriminatorValue("Plane") publicclassPlane{...} @Entity @DiscriminatorValue("A320") publicclassA320extendsPlane{...} 整个层次结构中的所有父类和子类属性都映射到同一个表中,他们的实例通过一个辨别符列(discriminator)来区分。 Plane是父类。 @DiscriminatorColumn注解定义了辨别符列。 对于继承层次结构中的每个类,@DiscriminatorValue注解指定了用来辨别该类的值。 辨别符列名字默认为DTYPE,其默认值为实体名。 其类型为DiscriminatorType.STRING。 连接的子类 @Entity @Inheritance(strategy=InheritanceType.JOINED) publicclassBoatimplementsSerializable{...} @Entity publicclassFerryextendsBoat{...} @Entity @PrimaryKeyJoinColumn(name="BOAT_ID") publicclassAmericaCupClassextendsBoat{...} 以上所有实体使用JOINED策略Ferry和Boatclass使用同名的主键关联(eg: Boat.id=Ferry.id),AmericaCupClass和Boat关联的条件为Boat.id=AmericaCupClass.BOAT_ID. 从父类继承的属性 @MappedSuperclass publicclassBaseEntity{ @Basic @Temporal(TemporalType.TIMESTAMP) publicDategetLastUpdate(){...} publicStringgetLastUpdater(){...} ... } @EntityclassOrderextendsBaseEntity{ @IdpublicIntegergetId(){...} ... } 继承父类的一些属性,但不用父类作为映射实体,这时候需要@MappedSuperclass注解。 上述实体映射到数据库中的时候对应Order实体Bean,其具有id,lastUpdate,lastUpdater三个属性。 如果没有@MappedSuperclass注解,则父类中属性忽略,这是Order实体Bean只有id一个属性。 映射实体Bean的关联关系 一对一 使用@OneToOne注解可以建立实体Bean之间的一对一关系。 一对一关系有3种情况。 ? 关联的实体都共享同样的主键。 @Entity publicclassBody{ @Id publicLonggetId(){returnid;} @OneToOne(cascade=CascadeType.ALL) @PrimaryKeyJoinColumn publicHeartgetHeart(){ returnheart; } ... } @Entity publicclassHeart{ @Id publicLonggetId(){...} } 通过@PrimaryKeyJoinColumn注解定义了一对一的关联关系。 多对一 使用@ManyToOne注解定义多对一关系。 @Entity() publicclassFlightimplementsSerializable{ @ManyToOne(cascade={CascadeType.PERSIST,CascadeType.MERGE}) @JoinColumn(name="COMP_ID") publicCompanygetCompany(){ returncompany; } ... } 其中@JoinColumn注解是可选的,关键字段默认值和一对一关联的情况相似。 列名为: 主题的关联属性名+下划线+被关联端的主键列名。 本例中为company_id,因为关联的属
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Hibernate 注释 大全 收藏