在数据库中中间表往往可能没有主键,而Hibernate检索的时候是根据主键检索的,这样就无法直接检索中间表中的数据。对于这种情况Hibernate会自动生成一个主键辅助类来辅助检索,下面看具体使用方法。
数据库存在数据表region表存有两个字段,一个city字段,一个code字段,city字段存放城市名,code字段存放城市代码。没有指定主键。
这是使用Hibernate的反向工程自动创建POJO类和映射关系。同时会自动生成一个辅助类。
首先看一下POJO类。
public class RegionId implements java.io.Serializable { // Fields private String city; private String eamcode; // Constructors /** default constructor */ public RegionId() { } /** full constructor */ public RegionId(String city, String eamcode) { this.city = city; this.eamcode = eamcode; } // Property accessors public String getCity() { return this.city; } public void setCity(String city) { this.city = city; } public String getEamcode() { return this.eamcode; } public void setEamcode(String eamcode) { this.eamcode = eamcode; } }
然后看他的辅助类
public class Region implements java.io.Serializable { // Fields private RegionId id; // Constructors /** default constructor */ public Region() { } /** full constructor */ public Region(RegionId id) { this.id = id; } // Property accessors public RegionId getId() { return this.id; } public void setId(RegionId id) { this.id = id; } }
我们可以看到这个辅助类中只有一个RegionId类型的成员id。
下面看一下他的映射关系。
<hibernate-mapping> <class name=Region" table="region" schema="dbo"> <composite-id name="id" class="RegionId"> <key-property name="city" type="java.lang.String"> <column name="city" length="20" /> </key-property> <key-property name="eamcode" type="java.lang.String"> <column name="eamcode" length="20" /> </key-property> </composite-id> </class> </hibernate-mapping>
上述类和映射文件都是Hibernate反向工程自动生成的。
下面看一下如何操作数据表,这里已查询为例:
public List findByProperty(String propertyName, Object value) { try { String queryString = "from Region as model where model." + propertyName + "= ?"; Query queryObject = getSession().createQuery(queryString); queryObject.setParameter(0, value); return queryObject.list(); } catch (RuntimeException re) { throw re; } }
然后看测试类
public static void main(String[] args) { RegionDAO df = new RegionDAO(); List list = df.findByProperty("id.city", "3701"); Region u = (Region) list.get(0); System.out.println(u.getId().getcode()); }
这里要注意的是操作的一直是Hibernate生成的辅助类,但是在传数据时还有获取数据时都是从Region类的Id中获取指定的RegionId。
时间: 2024-10-08 10:04:11