<hibernate-mapping schema="SYSTEM" default-lazy="true" default-access="field" auto-import="false"> </hibernate-mapping>schema:一个数据库Schema前缀SYSTEM能够被Hibernate用给已映射类所生成的所有SQL声明
@org.hibernate.annotations.TypeDefs({ @org.hibernate.annotations.TypeDef( name="monetary_amount_usd", typeClass=MonetaryAmountType.class, parameters={@org.hibernate.annotations.Parameter(name="convertTo",value="USD")} ), @org.hibernate.annotations.TypeDef( name="monetary_amount_eur", typeClass=MonetaryAmountType.class, parameters={@org.hibernate.annotations.Parameter(name="convertTo",value="EUR")} ) }) @org.hibernate.annotations.NamedNativeQueries({ @org.hibernate.annotations.NamedNativeQuery( name="findItemsOrderByPrice", query="select i from Item i order by i.initialPrice") }) package auction.persistence.types;包元数据文件的这个例子,在包auction.persistence.types中,它声明了两个Hibernate类型转换器。后面会讨论Hibernate类型系统。
<id name="id" type="integer"> <generator class="&idgenerator;" /> </id>&idgenerator;值称作实体点位符。可以在XML文件的顶部定义它的值为实体声明,作为文档类型定义的一部分:
<id name="id" type="integer"> <generator class="&idgenerator;" /> </id>当映射文件被读取的时候,XML解析器现在将在Hibernate启动时替换点位符。
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" [ <!ENTITY % globals SYSTEM "classpath://persistence/globals.dtd"> %globals; ]>persistence包里的globals.dtd文件中:
<!ENTITY idgenerator "native">要从Oracle切换到一个不同的数据库系统,只要部署一个不同的globals.dtd文件。
<property name="dateModified" column="DATE_MOD" type="timestamp"/>这个文件不需要XML首部或者任何其他标签。现在为一个持久化类把它包括在映射文件中:
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" [ <!ENTITY dateModified SYSTEM "classpath://model/UserName.xml"> ]> <hibernate-mapping> <class name="Item" table="TBL_ITEM"> <id ...> &datemodified; ... </class> </hibernate-mapping>DateModified.xml的内容将被&datemodified;点位符包括和替换。当然,这也适用于较大的XML片段。
// Get the existing mapping for User from Configuration PersistentClass userMapping = cfg.getClassMapping(User.class.getName()); // Define a new column for the USER table Column column = new Column(); column.setName("ADDRESS");// 列名称 column.setNullable(true);// 列是否可为空 // tbl_user表添加address列 userMapping.getTable().addColumn(column); // SimpleValue包裹Column SimpleValue value = new SimpleValue(null); value.setTable(userMapping.getTable()); value.setTypeName("string"); value.addColumn(column); // 在User类中定义新属性 Property prop = new Property(); prop.setValue(value); prop.setName("address"); prop.setNodeName(prop.getName()); userMapping.addProperty(prop); // 创建一个新的SessionFactory工厂,使用新的映射 // 一旦创建了SessionFactory,它的映射就是不可变的 SessionFactory sf = cfg.buildSessionFactory();PersistentClass对象表示了单个持久类的元模型,你从Configuration对象中获取它。Column、SimpleValue和Property是Hibernate元模型的所有类,可以在org.hibernate.mapping包中使用它们。
User user = new User(); user.setUsername("admin"); user.setPassword("bdqn"); ClassMetadata meta = sf.getClassMetadata(user.getClass()); String[] metaPropertyNames = meta.getPropertyNames(); for (String s : metaPropertyNames) { System.out.println("属性:" + s); } Object[] propertyValues = getParamsByEntity(sf, user, EntityMode.POJO); for (Object o : propertyValues) { System.out.println("属性值: " + o); }
Hibernate实战_笔记20(全局XML映射元数据、全局的注解元数据、占位符),布布扣,bubuko.com
Hibernate实战_笔记20(全局XML映射元数据、全局的注解元数据、占位符)
原文:http://blog.csdn.net/com185272358/article/details/21242551