Hibernate命名策略详解
hibernate的命名策略,可以减少对数据库标识符命名的维护,进一步减少这部份命名的重复性代码量,以提高维护。
hibernate的命名方式,有两类,一类是显式命名,一类是隐式命名。
1)显式命名:在映射配置时,设置的数据库表名,列名等,就是进行显式命名。
2)隐式命名:显式命名一般不是必要的,所以可以选择当不设置名称,这时就交由hibernate进行隐式命名,另外隐式命名还包括那些不能进行显式命名的数据库标识符。接口ImplicitNamingStrategy,就是用于实现隐式命名。
3)过滤命名:接口PhysicalNamingStrategy,用于对显式命名或隐式命名进一步过滤处理。
示例:
TestTable1Impl.java
@Entity //隐式命名表名 @Table publicclassTestTable1Impl{ //--------------------------------------------------------------- //Field //--------------------------------------------------------------- @Id @Column() @GeneratedValue(strategy=GenerationType.IDENTITY) privateLongtestId; @Column(length=20) privateStringtestName; @ManyToOne privateTestTable2ImpltestForeign; //--------------------------------------------------------------- //Method //--------------------------------------------------------------- publicLonggetId(){ returntestId; } publicvoidsetId(Longid){ this.testId=id; } publicStringgetName(){ returntestName; } publicvoidsetName(Stringname){ this.testName=name; } publicTestTable2ImplgetTestForeign(){ returntestForeign; } publicvoidsetTestForeign(TestTable2ImpltestForeign){ this.testForeign=testForeign; } }
TestTable2Impl.java
@Entity //显式命名表名 @Table(name="TestTable2Impl") publicclassTestTable2Impl{ //--------------------------------------------------------------- //Field //--------------------------------------------------------------- @Id @Column() @GeneratedValue(strategy=GenerationType.IDENTITY) privateLongtestId; @Column(length=20) privateStringtestName; //--------------------------------------------------------------- //Method //--------------------------------------------------------------- publicLonggetId(){ returntestId; } publicvoidsetId(Longid){ this.testId=id; } publicStringgetName(){ returntestName; } publicvoidsetName(Stringname){ this.testName=name; } }
MyImplicitNamingStrategyImpl.java
publicclassMyImplicitNamingStrategyImplextendsImplicitNamingStrategyJpaCompliantImplimplementsImplicitNamingStrategy{ @Override publicIdentifierdeterminePrimaryTableName(ImplicitEntityNameSourcesource){ Identifiername=super.determinePrimaryTableName(source); Identifierresult=toStandard(name,"Impl"); System.out.println("ImplicitNamingStrategy/PrimaryTableName->\n\t"+name+"=>"+result); returnresult; } privateIdentifiertoStandard(Identifiername,String...removeSuffixes){ if(removeSuffixes==null) returnname; if(name==null) returnnull; Stringtext=name.getText(); if(removeSuffixes!=null){ for(Stringsuffix:removeSuffixes){ if(text.endsWith(suffix)) text=text.substring(0,text.length()-suffix.length()); } } returnnewIdentifier(text,name.isQuoted()); } @Override publicIdentifierdetermineJoinTableName(ImplicitJoinTableNameSourcesource){ Identifiername=super.determineJoinTableName(source); System.out.println("ImplicitNamingStrategy/JoinTableName->\n\t"+name); returnname; } @Override publicIdentifierdetermineCollectionTableName(ImplicitCollectionTableNameSourcesource){ Identifiername=super.determineCollectionTableName(source); System.out.println("ImplicitNamingStrategy/CollectionTableName->\n\t"+name); returnname; } @Override publicIdentifierdetermineDiscriminatorColumnName(ImplicitDiscriminatorColumnNameSourcesource){ Identifiername=super.determineDiscriminatorColumnName(source); System.out.println("ImplicitNamingStrategy/DiscriminatorColumnName->\n\t"+name); returnname; } @Override publicIdentifierdetermineTenantIdColumnName(ImplicitTenantIdColumnNameSourcesource){ Identifiername=super.determineTenantIdColumnName(source); System.out.println("ImplicitNamingStrategy/TenantIdColumnName->\n\t"+name); returnname; } @Override publicIdentifierdetermineIdentifierColumnName(ImplicitIdentifierColumnNameSourcesource){ Identifiername=super.determineIdentifierColumnName(source); System.out.println("ImplicitNamingStrategy/IdentifierColumnName->\n\t"+name); returnname; } @Override publicIdentifierdetermineBasicColumnName(ImplicitBasicColumnNameSourcesource){ Identifiername=super.determineBasicColumnName(source); System.out.println("ImplicitNamingStrategy/BasicColumnName->\n\t"+name); returnname; } @Override publicIdentifierdetermineJoinColumnName(ImplicitJoinColumnNameSourcesource){ Identifiername=super.determineJoinColumnName(source); finalStringresult; if(source.getNature()==ImplicitJoinColumnNameSource.Nature.ELEMENT_COLLECTION||source.getAttributePath()==null){ result=transformEntityName(source.getEntityNaming()); }else{ result=transformAttributePath(source.getAttributePath()); } System.out.println("ImplicitNamingStrategy/JoinColumnName->\n\t"+name+"=>"+result); returntoIdentifier(result,source.getBuildingContext()); } @Override publicIdentifierdeterminePrimaryKeyJoinColumnName(ImplicitPrimaryKeyJoinColumnNameSourcesource){ Identifiername=super.determinePrimaryKeyJoinColumnName(source); System.out.println("ImplicitNamingStrategy/PrimaryKeyJoinColumnName->\n\t"+name); returnname; } @Override publicIdentifierdetermineAnyDiscriminatorColumnName(ImplicitAnyDiscriminatorColumnNameSourcesource){ Identifiername=super.determineAnyDiscriminatorColumnName(source); System.out.println("ImplicitNamingStrategy/AnyDiscriminatorColumnName->\n\t"+name); returnname; } @Override publicIdentifierdetermineAnyKeyColumnName(ImplicitAnyKeyColumnNameSourcesource){ Identifiername=super.determineAnyKeyColumnName(source); System.out.println("ImplicitNamingStrategy/AnyKeyColumnName->\n\t"+name); returnname; } @Override publicIdentifierdetermineMapKeyColumnName(ImplicitMapKeyColumnNameSourcesource){ Identifiername=super.determineMapKeyColumnName(source); System.out.println("ImplicitNamingStrategy/MapKeyColumnName->\n\t"+name); returnname; } @Override publicIdentifierdetermineListIndexColumnName(ImplicitIndexColumnNameSourcesource){ Identifiername=super.determineListIndexColumnName(source); System.out.println("ImplicitNamingStrategy/ListIndexColumnName->\n\t"+name); returnname; } @Override publicIdentifierdetermineForeignKeyName(ImplicitForeignKeyNameSourcesource){ Identifiername=super.determineForeignKeyName(source); Stringresult=null; StringtableName=source.getTableName().getText(); if(tableName.startsWith(TableNamingConfig.TABLE_PREFIX)) tableName=tableName.substring(TableNamingConfig.TABLE_PREFIX.length()); if(source.getColumnNames().size()==1){ result=TableNamingConfig.FOREIGN_KEY_PREFIX+tableName+"_"+source.getColumnNames().get(0).getText(); }else{ StringcolumnName=source.getReferencedTableName().getText(); if(columnName.startsWith(TableNamingConfig.TABLE_PREFIX)) columnName=columnName.substring(TableNamingConfig.TABLE_PREFIX.length()); result=TableNamingConfig.FOREIGN_KEY_PREFIX+tableName+"_"+columnName; } System.out.println("ImplicitNamingStrategy/ForeignKeyName->\n\t"+name+"=>"+result); returnnewIdentifier(result,name.isQuoted()); } @Override publicIdentifierdetermineUniqueKeyName(ImplicitUniqueKeyNameSourcesource){ Identifiername=super.determineUniqueKeyName(source); System.out.println("ImplicitNamingStrategy/UniqueKeyName->\n\t"+name); returnname; } @Override publicIdentifierdetermineIndexName(ImplicitIndexNameSourcesource){ Identifiername=super.determineIndexName(source); System.out.println("ImplicitNamingStrategy/IndexName->\n\t"+name); returnname; } }
MyPhysicalNamingStrategyImpl.java
publicclassMyPhysicalNamingStrategyImplimplementsPhysicalNamingStrategy{ @Override publicIdentifiertoPhysicalCatalogName(Identifiername,JdbcEnvironmentjdbcEnvironment){ System.out.println("PhysicalNamingStrategy/catalog->\n\t"+name); returnname; } @Override publicIdentifiertoPhysicalSchemaName(Identifiername,JdbcEnvironmentjdbcEnvironment){ System.out.println("PhysicalNamingStrategy/schema->\n\t"+name); returnname; } @Override publicIdentifiertoPhysicalTableName(Identifiername,JdbcEnvironmentjdbcEnvironment){ Identifierresult=toStandard(name,"tb_"); System.out.println("PhysicalNamingStrategy/table->\n\t"+name+"=>"+result); returnresult; } @Override publicIdentifiertoPhysicalSequenceName(Identifiername,JdbcEnvironmentjdbcEnvironment){ System.out.println("PhysicalNamingStrategy/sequence->\n\t"+name); returnname; } @Override publicIdentifiertoPhysicalColumnName(Identifiername,JdbcEnvironmentjdbcEnvironment){ Identifierresult=toStandard(name); System.out.println("PhysicalNamingStrategy/column->\n\t"+name+"=>"+result); returnresult; } privateIdentifiertoStandard(Identifiername){ returntoStandard(name,null); } privateIdentifiertoStandard(Identifiername,Stringprefix){ if(name==null) returnnull; Stringtext=name.getText(); StringBufferbuffer=newStringBuffer(); if(prefix!=null) buffer.append(prefix); char[]chars=text.toCharArray(); for(inti=0,len=chars.length;i<len;i++){ charc1=chars[i]; if(c1>='A'&&c1<='Z'){ if(i>0&&i+1<len){ if(chars[i+1]<'A'||chars[i+1]>'Z') buffer.append('_'); } c1=(char)(c1-'A'+'a'); } buffer.append(c1); } returnnewIdentifier(buffer.toString(),name.isQuoted()); } }
TableNamingConfig.java
publicclassTableNamingConfig{ publicstaticfinalStringTABLE_PREFIX="tb_"; publicstaticfinalStringFOREIGN_KEY_PREFIX="fk_"; }
spring.xml
<?xmlversion="1.0"encoding="UTF-8"?> <beansxmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.1.xsd"> <!--配置数据源--> <beanid="dataSource"class="com.mchange.v2.c3p0.ComboPooledDataSource"> <propertyname="driverClass"value="com.mysql.jdbc.Driver"></property> <propertyname="jdbcUrl"value="jdbc:mysql://localhost:3306/test?useSSL=false"></property> <propertyname="user"value="root"></property> <propertyname="password"value="123456"></property> </bean> <beanid="physicalNamingStrategy"class="test.MyPhysicalNamingStrategyImpl"></bean> <beanid="implicitNamingStrategy"class="test.MyImplicitNamingStrategyImpl"></bean> <beanid="sessionFactory"class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> <propertyname="dataSource"ref="dataSource"/> <propertyname="packagesToScan"> <list> <!--可以加多个包--> <value>test</value> </list> </property> <propertyname="hibernateProperties"> <props> <propkey="hibernate.hbm2ddl.auto">create-drop</prop> <propkey="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop> <propkey="hibernate.show_sql">true</prop> <propkey="hibernate.format_sql">true</prop> <propkey="hibernate.temp.use_jdbc_metadata_defaults">false</prop> </props> </property> <propertyname="physicalNamingStrategy"ref="physicalNamingStrategy"></property> <propertyname="implicitNamingStrategy"ref="implicitNamingStrategy"></property> </bean> </beans>
Test.java
publicclassTest{ publicstaticvoidmain(String[]params){ //命名策略 newTest().test(); /* PhysicalNamingStrategy/catalog-> null PhysicalNamingStrategy/catalog-> null PhysicalNamingStrategy/column-> DTYPE=>dtype ImplicitNamingStrategy/PrimaryTableName-> TestTable1Impl=>TestTable1 PhysicalNamingStrategy/table-> TestTable1=>tb_test_table1 ImplicitNamingStrategy/BasicColumnName-> testId PhysicalNamingStrategy/column-> testId=>test_id ImplicitNamingStrategy/BasicColumnName-> testId ImplicitNamingStrategy/BasicColumnName-> testForeign PhysicalNamingStrategy/column-> testForeign=>test_foreign ImplicitNamingStrategy/BasicColumnName-> testName PhysicalNamingStrategy/column-> testName=>test_name ImplicitNamingStrategy/BasicColumnName-> testName PhysicalNamingStrategy/column-> DTYPE=>dtype PhysicalNamingStrategy/table-> TestTable2Impl=>tb_test_table2_impl ImplicitNamingStrategy/BasicColumnName-> testId PhysicalNamingStrategy/column-> testId=>test_id ImplicitNamingStrategy/BasicColumnName-> testId ImplicitNamingStrategy/BasicColumnName-> testName PhysicalNamingStrategy/column-> testName=>test_name ImplicitNamingStrategy/BasicColumnName-> testName ImplicitNamingStrategy/JoinColumnName-> testForeign_testId=>testForeign PhysicalNamingStrategy/column-> testForeign=>test_foreign ImplicitNamingStrategy/ForeignKeyName-> FKlnurug7wfle1u6fc5oulnrx94=>fk_test_table1_test_foreign Hibernate: altertabletb_test_table1 drop foreignkeyfk_test_table1_test_foreign Hibernate: droptableifexiststb_test_table1 Hibernate: droptableifexiststb_test_table2_impl Hibernate: createtabletb_test_table1( test_idbigintnotnullauto_increment, test_namevarchar(20), test_foreignbigint, primarykey(test_id) ) Hibernate: createtabletb_test_table2_impl( test_idbigintnotnullauto_increment, test_namevarchar(20), primarykey(test_id) ) Hibernate: altertabletb_test_table1 addconstraintfk_test_table1_test_foreign foreignkey(test_foreign) referencestb_test_table2_impl(test_id) Hibernate: altertabletb_test_table1 drop foreignkeyfk_test_table1_test_foreign Hibernate: droptableifexiststb_test_table1 Hibernate: droptableifexiststb_test_table2_impl */ } publicvoidtest(){ ApplicationContextcontext=newClassPathXmlApplicationContext("spring.xml",this.getClass()); SessionFactoryfactory=null; try{ factory=(SessionFactory)context.getBean("sessionFactory"); }finally{ if(factory!=null){ factory.close(); factory=null; } } } }
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持毛票票!