Hibernate操作没有主键数据表

在数据库中中间表往往可能没有主键,而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。





郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。