JAVA教程之Hibernate正文下的自界说架构完成仓酷云
但是对于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我觉得最应该避免的就是:只学习,不思考,只记忆,不实践! 不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。 自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。 Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站 Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。 还好,SUN提供了Javabean可以把你的JSP中的 Java代码封装起来,便于调用也便于重用。 Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。 自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。 Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台 学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。 是一种为 Internet发展的计算机语言 是一种使网页(Web Page)由静态(Static)转变为动态(Dynamic)的语言 科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。 Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站 Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。 《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。 象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。 Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。 Java 编程语言的风格十分接近C、C++语言。
页:
[1]