hibernate之定制属性访问(field|property|noop)
2010-09-11 18:38
288 查看
定制属性访问
类的属性由持久化引擎直接(通过字段)或者间接(通过获取方法和设置方法)访问。在xml映射文件中,用的
default-access="field|property|noop|custom.Class"属性给类控制默认的访问策略。
也可以用access属性在hibernate xml映射中控制属性级上的访问策略,如:
field是字段访问,property是属性访问. 另一个可能有用的策略是noop,它映射java持久化类中不存在的属性,这听起来
有点奇怪,但是它让你在HQL查询中指向这个"虚拟"属性(换句话说,只在HQL查询中使用数据库列).
在属性上使用访问策略noop的实例.
pom.xml:
resources/proxool.xml:
resources/hibernate.cfg.xml:
HibernateTest/Student.java , 注意:这里已经没有了age属性
HibernateTest/Student.hbm.xml, 注意:这里我们添加了一个myAge映射,myAge是一个不存在的属性.
util/HibernateUtil.java:
util/StudentManager.java , 注意HQL语句,其中用了myAge:
类的属性由持久化引擎直接(通过字段)或者间接(通过获取方法和设置方法)访问。在xml映射文件中,用的
default-access="field|property|noop|custom.Class"属性给类控制默认的访问策略。
也可以用access属性在hibernate xml映射中控制属性级上的访问策略,如:
field是字段访问,property是属性访问. 另一个可能有用的策略是noop,它映射java持久化类中不存在的属性,这听起来
有点奇怪,但是它让你在HQL查询中指向这个"虚拟"属性(换句话说,只在HQL查询中使用数据库列).
在属性上使用访问策略noop的实例.
pom.xml:
]<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>hibernateTest</groupId> <artifactId>hibernateTest</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <name>hibernateTest</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>3.3.1.GA</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-nop</artifactId> <version>1.5.2</version> </dependency> <dependency> <groupId>javassist</groupId> <artifactId>javassist</artifactId> <version>3.4.GA</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-proxool</artifactId> <version>3.3.1.GA</version> </dependency> <dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc14</artifactId> <version>10.2.0.3.0</version> <scope>runtime</scope> </dependency> </dependencies> <build> <finalName>hibernateTest</finalName> <resources> <resource> <directory>src/main/resources</directory> </resource> <resource> <directory>src/main/java</directory> <excludes> <exclude>**/*.java</exclude> </excludes> </resource> </resources> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.6</source> <target>1.6</target> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build> </project>
resources/proxool.xml:
]<?xml version="1.0" encoding="UTF-8"?> <something-else-entirely> <proxool> <!-- 连接池的别名 --> <alias>proxool</alias> <!-- proxool只能管理由自己产生的连接 --> <driver-url>jdbc:oracle:thin:@localhost:1521:XE</driver-url> <!--JDBC驱动程序--> <driver-class>oracle.jdbc.driver.OracleDriver</driver-class> <!-- 用户名与密码 --> <driver-properties> <property name="user" value="system" /> <property name="password" value="password" /> </driver-properties> <!-- 允许最大连接数 ,默认是15,这里设置为20--> <maximum-connection-count>20</maximum-connection-count> <!-- 最小连接数 ,默认是5,其实可以不用声明它--> <minimum-connection-count>5</minimum-connection-count> <!-- 测试连接的sql语句 --> <house-keeping-test-sql>select sysdate from dual</house-keeping-test-sql> </proxool> </something-else-entirely>
resources/hibernate.cfg.xml:
]<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory name="sessionFactory"> <property name="hibernate.connection.provider_class"> org.hibernate.connection.ProxoolConnectionProvider </property> <property name="hibernate.proxool.pool_alias">proxool</property> <property name="hibernate.proxool.xml">proxool.xml</property> <!-- 输出sql --> <property name="hibernate.show_sql">true</property> <!-- 格式化sql --> <property name="hibernate.format_sql">true</property> <!--指定数据库适配器 --> <property name="dialect"> org.hibernate.dialect.OracleDialect </property> <!-- 映射文件 --> <mapping resource="hibernateTest/Student.hbm.xml" /> </session-factory> </hibernate-configuration>
HibernateTest/Student.java , 注意:这里已经没有了age属性
]package hibernateTest; /** * 这里我们去掉了age属性 * @author FUHAIDONG */ public class Student { private int id; private String name; private String address; public int getId() { return id; } @SuppressWarnings("unused") private void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
HibernateTest/Student.hbm.xml, 注意:这里我们添加了一个myAge映射,myAge是一个不存在的属性.
]<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping default-access="field"> <class name="hibernateTest.Student" table="STUDENT" mutable="false"> <id name="id" column="ID" type="int"> <generator class="sequence"> <!-- seq_student就是表student的主键自增的sequence --> <param name="sequence">seq_student</param> </generator> </id> <property name="name" column="name" type="string"/> <property name="address" column="address" type="string"/> <!-- 这里我们将AGE列映射到一个不存在的myAge属性上,使用的是access="noop" --> <property name="myAge" column="age" type="int" access="noop"/> </class> </hibernate-mapping>
util/HibernateUtil.java:
]package util; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateUtil { private static SessionFactory sessionFactory; static{ try { sessionFactory = new Configuration().configure().buildSessionFactory(); } catch (Throwable e) { throw new ExceptionInInitializerError(e); } } public static SessionFactory getSessionFactory(){ return sessionFactory; } public static void shutdown(){ getSessionFactory().close(); } }
util/StudentManager.java , 注意HQL语句,其中用了myAge:
]package util; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.Transaction; public class StudentManager { @SuppressWarnings("rawtypes") public static void main(String[] args) { Session session = HibernateUtil.getSessionFactory().openSession(); Transaction transaction1 = session.beginTransaction(); //我们在hql中使用到了Student实体中不存在的myAge属性,它是虚拟的 String hql = "select myAge from Student"; Query q = session.createQuery(hql); List list = q.list(); for(int i=0;i<list.size();i++){ System.out.println("age: " + list.get(i)); } transaction1.commit(); session.close(); } }
相关文章推荐
- 提高C#编程水平的50个要点 之一“总是用属性 (Property) 来代替可访问的数据成员(field)”
- 1.总是用属性 (Property) 来代替可访问的数据成员(field)
- 尽可能使用属性(Property),少使用字段(Field)实现对数据的访问 (轉 )
- Effective C# 原则1:尽可能的使用属性(property),而不是数据成员(field)
- 通过晚期绑定读写属性Property和字段Field
- 原则1:尽量使用属性(property)而非数据成员(field)
- Effective C# 原则1:尽可能的使用属性(property),而不是数据成员(field)。
- 攻城狮在路上(壹) Hibernate(三)--- 属性访问、命名策略、派生属性、指定包名等
- Hibernate AccessType.PROPERTY和AccessType.FIELD的区别
- C#中的域(field)和属性(property)_C#教程
- JPA字段/属性访问策略(JPA field access strategy)
- Hibernate访问持久化类属性的策略
- TextArea Field in SharePoint webpart property 在sharepoint webpart属性面版里使用TextArea
- hibernate映射文件property 元素属性
- Hibernate之访问属性策略和方法逻辑注入
- C#中的域(field)和属性(property)_C#教程
- Hibernate的访问类型access 属性
- Hibernate使用property-ref属性解决遗留数据库One To Many关系的问题。
- xdoclet生成hibernate映射文件,property标签里多了access="field"问题?
- hibernate多对一lazy属性导致 s iterator session list的访问失败