|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
但是对于JAVA技术类的学习,我觉得大课堂反而会影响自身独立思考的过程,因为上课的时候,老师讲课的速度很快为了不遗漏要点,通常会仔细的听,关于Java开辟职员,Hibernate3annotations供应了十分好的体例来展现域分层。你能够很轻松的经由过程Hibernate主动天生必要的数据库架构,带有完全的SQL剧本。但是回到实际天下,你还必要思索到,偶然数据库办理员所利用的含混的定名常规。本文中,“JavaPowerTools”的作者JohnFergusonSmart将告知你怎样经由过程Hibernate主动天生数据库架构,并且还便利数据库办理。
Hibernate3正文有一种壮大的耐久办理数据库的体例,使用这些正文,你不必要为XML映照文件而操心,你能够设置成默许,由体系完成,从而削减了大批必要保护的代码。Hibernate供应了壮大的主动天生数据库架构的工具,因而Hibernate能够主动完成天生和更新数据库架构的操纵,你也无需忧虑那些难以想象的SQL剧本。
第一步:更新数据库架构
用Hibernate主动更新数据库架构很简单,你所必要做的只是设置好Hibernate.hbm2ddl.auto,如示例1:
示例1:- <hibernate-configuration><session-factory><propertyname="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property><propertyname="hibernate.hbm2ddl.auto">create-drop</property>...<!--Persistentclasses--><mappingclass="com.mycompany.myapp.domain.Client"/><mappingclass="com.mycompany.myapp.domain.Order"/>...</session-factory></hibernate-configuration>
复制代码 设置它的属性为“create-drop”,那末每次启动使用程序城市发生新的数据库,这对集成测试很有效,可是有些情形下却不必要。另外一方面,假如你设置这个值是为了更新,假如不存在数据库,Hibernate只会主动创立数据库,并更新与以后域模子婚配的一切表。
如今,在默许情形下,Hibernate将创立一套与Java类很类似的表及字段,从Java开辟者的角度来看如许恰好切合请求。思索上面的例子:
示例2:Asimplepersistentclass- @EntitypublicclassClientimplementsSerializable{@Id@GeneratedValue(strategy=GenerationType.AUTO)privateLongid;privateStringfirstName;privateStringlastName;...}这个类中,Hibernate在默许情形下创立SQL形式,能够持续看示例3。示例3:
复制代码- createtableClient(idbigintgeneratedbydefaultasidentity(startwith1),firstNamevarchar(255),lastNamevarchar(255),...primarykey(id));
复制代码 旧的定名常规
数据库的常规商定有相称充实的来由存在,可是在任何情形下DBA经常要守旧一些。开辟者该怎样做呢?
一个复杂的办理举措是利用名字特性:@Entity、@Column正文,这类办法优于默许情形下,如示例4:
示例4:- @Entity(name="T_CLIENT")publicclassClientimplementsSerializable{...@Id@GeneratedValue(strategy=GenerationType.AUTO)@Column(name="CLIENT_ID")privateLongid;@Column(name="FIRST_NAME")privateStringfirstName;@Column(name="LAST_NAME")privateStringlastName;...}如许很有感化,可是会有些贫苦,你不能不有更多的表。实践上,你必需对每一个表及字段都做如许的操纵。有无更好的办法呢?固然,你能够在Hibernate会话中界说定名战略汇合代替默许值。如许的话你得写一个类,申明Hibernate怎样界说表及字段名。从ImprovedNamingStrategy类入手下手是一个得当地位,用下划线转换类名,如SomeDomainEntity,转换成some_domain_entity。在启动Hibernate会话时需筹办这个类。假如你用Spring,需简化创立定名战略bean并为定名战略汇合供应所创立的定名战略。示例5就是Spring设置的典范申明:示例5:<beanid="sessionFactory"class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"><propertyname="dataSource"ref="dataSource"/><propertyname="configLocation"value="classpath:/hibernate.cfg.xml"/><propertyname="configurationClass"value="org.hibernate.cfg.AnnotationConfiguration"/><propertyname="namingStrategy"ref="namingStrategy"/></bean><beanid="namingStrategy"class="org.hibernate.cfg.ImprovedNamingStrategy"/>在这类定名战略下,Hibernate将天生以下面示例6的剧本:示例6:createtableclient(idbigintgeneratedbydefaultasidentity(startwith1),first_namevarchar(255),last_namevarchar(255),...primarykey(id));如许固然很好,可是它不克不及办理你所的成绩。还必要数据库定名商定。比方,每一个表都大概从“T_”入手下手(好比T_CLIENT就是Client类),大概表中的每一个字段大概以表中特定的前缀入手下手(好比写成CLI_FIRST_NAME和CLI_LAST_NAME)。为了能主动天生这些束缚,你写本人的定名战略实行。自界说定名战略完成自界说定名战略最复杂的办法是扩大ImprovedNamingStrategy类。这个类供应一些用户默许的情形,因而你只需完成你真正必要的办法就能够。你能够不往理会通用款式义务的表名和列名办法,好比,把称号都加上年夜写字母。Hibernate天生表或列名时就会挪用这类办法,乃至是在正文中明白指定的列名也会挪用这类办法。,从ImprovedNamingStrategy类承继而来的addUnderscores()办法,能够派上用处,如示例7所示:示例7:publicclassMyNamingStrategyextendsImprovedNamingStrategyimplementsNamingStrategy{@OverridepublicStringcolumnName(StringcolumnName){returnaddUnderscores(columnName).toUpperCase();}@OverridepublicStringtableName(StringtableName){returnaddUnderscores(tableName).toUpperCase();}}接上去的示例8,展示的是怎样在表名前加“T_”前缀,转换成名字前加年夜写字母和下划线。示例8:@OverridepublicStringclassToTableName(StringclassName){return"T_"+tableName(className);}@OverridepublicStringpropertyToColumnName(StringpropertyName){returnaddUnderscores(propertyName).toUpperCase();}一个更庞大的定名战略定名战略接话柄际上十分复杂,但在良多方面受限定。起首,在任何特定的工夫你没法晓得挪用办法的参数是属于哪一个表。如许会受限定,好比,假如必要在表中每一个列名前加表前缀,正如数据库商定所请求的。能够在classToTableName()办法中加变量成员存储以后的表,来办理这个限定。关于给定的表,这个办法将在propertyToColunmName()办法后被挪用。比方,示例9为表创立了三个字母的前缀,加在表名及表中一切列名前。示例9:publicclassMyNamingStrategyextendsImprovedNamingStrategyimplementsNamingStrategy{privateStringcurrentTablePrefix;@OverridepublicStringclassToTableName(StringclassName){currentTablePrefix=className.substring(0,3).toUpperCase()+"_";return"T"+currentTablePrefix+tableName(className);}@OverridepublicStringpropertyToColumnName(StringpropertyName){returncurrentTablePrefix+addUnderscores(propertyName).toUpperCase();}@OverridepublicStringcolumnName(StringcolumnName){returnaddUnderscores(columnName).toUpperCase();}@OverridepublicStringtableName(StringtableName){returnaddUnderscores(tableName).toUpperCase();}}利用这类定名战略,Hibernate将发生如示例10的代码:示例10:createtableTCLI_CLIENT(CLI_IDbigintgeneratedbydefaultasidentity(startwith1),CLI_FIRST_NAMEvarchar(255),CLI_LAST_NAMEvarchar(255),...primarykey(CLI_ID));内部关头字一样平常很难主动天生的内部关头字,组成了一个贫苦的成绩。默许情形下,Hibernate可随机天生如“FKAB1273D65CCF7AB”如许的名字,DBA不会喜好如许主动发生的定名。办理这个成绩,必要利用@ForeignKey正文,如示例11所示:示例11:@EntitypublicclassOrder{...@JoinColumn(name="CLIENT_ID")@ManyToOne(optional=false)@ForeignKey(name="FK_CLIENT_ORDERS")privateClientclient;...}多对多干系固然,庞大的干系下(好比多对多的干系),下面所说的变得有些更庞大。比方,示例12中的SocialNerworker类,有很多伴侣。这类情形下,你必要利用像@JoinTable,@ForeignKey如许的正文。示例12:@EntitypublicclassSocialNetworker{@ManyToMany@JoinTable(name="TFRD_FRIEND",joinColumns={@JoinColumn(name="NETWORKER_ID")},inverseJoinColumns={@JoinColumn(name="FRIEND_ID")})@ForeignKey(name="FK_SNT_FRIENDS",inverseName="FK_FRD_FRIENDS")}privateSet<SocialNetworker>friends=newHashSet<SocialNetworker>();...}展现SQL剧本一旦你必要对数据库做修改或更新时,数据库办理员出于职责会很审慎,大概会看要实行的SQL剧本,Hibernate能够经由过程SchemaExport工具,展现SQL剧本。你利用这个工具把要完成的形式天生一般的SQL剧本。固然,此类操纵你不想做为构建历程的一部分往做,假如利用Maven,比方,你利用Hibernate3-maven-plugin主动天生数据库架构。关头部分如示例13所示,固然你能够设置drop和export为false,如许就相称于没有更新数据库材料。示例13:<plugin><groupId>org.codehaus.mojo</groupId><artifactId>hibernate3-maven-plugin</artifactId><version>2.1</version><executions><execution><phase>process-classes</phase><goals><goal>hbm2ddl</goal></goals></execution></executions><configuration><components><component><name>hbm2ddl</name><implementation>annotationconfiguration</implementation></component><component><name>hbmdoc</name></component></components><componentProperties><configurationfile>/target/classes/hibernate.cfg.xml</configurationfile><outputfilename>schema.ddl</outputfilename><namingstrategy>mycompany.myapp.IRDNamingStrategy</namingstrategy><drop>false</drop><create>true</create><export>false</export><format>true</format></componentProperties></configuration></plugin>如许会天生SQL剧本,能够拿给DBA们看了。
复制代码- 总结DBA定名常规保存了上去,假如你将与他们同事,将必要顾及这些常规。侥幸的是,这其实不意味着你要保持Hibernate主动发生的数据库架构,也不必自已写SQL剧本。用相分离的定名战略,你会取得共赢。
复制代码- 来自:http://www.yeeyan.com/articles/view/38467/12438原文:http://www.javaworld.com/javaworld/jw-08-2008/jw-08-hibernate-annotations.html
复制代码 而学习JAVA我觉得最应该避免的就是:只学习,不思考,只记忆,不实践! |
|