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。

时间: 2024-10-08 10:04:11

Hibernate操作没有主键数据表的相关文章

MSSQL如何在没有主键的表中删除重复数据

为了对重复数据进行实验,下面建一个设计不太好(没有主键)表并插入了一些重复数据: create database testdb use testdb ; go create table DupsNoPK (Col1 int Null, Col2 char(5) Null ); go insert DupsNoPK(Col1,Col2) Values(1,'abc'), (2,'abc'), (2,'abc'), (2,'abc'), (7,'xyz'), (7,'xyz'); 为了验证表确实有重

SQL多个主键的表,插入数据有重复时,查询数据的重复值?

SQL多个主键的表,插入数据有重复时,会提示违反主键约束不能插入的错误.那么,如何找到插入数据的重复值? 解决方法:使用group by 假设有个表#a,有saleid,vendorid,comid,price,saleprice,quantity等字段. 主键是:saleid,vendorid,comid三个.假设插入#a的数据源可能会有重复的. 即:saleid,vendorid,comid三个字段都一样的字段,那么插入#a的时候会报主键冲突,违反主键约束. 如果想找出#a表中插入重复的值可

Hibernate配置文件hbm主键的generator可选项

1.自动增长identity适用于MySQL.DB2.MS SQL Server,采用数据库生成的主键,用于为long.short.int类型生成唯一标识使用SQL Server 和 MySQL 的自增字段,这个方法不能放到 Oracle 中,Oracle 不支持自增字段,要设定sequence(MySQL 和 SQL Server 中很常用)数据库中的语法如下:MySQL:create table t_user(id int auto_increment primary key, name v

Hibernate学习:主键生成策略

一:标准的JPA  Annotation方式的主键生成策略: (1)AUTO - 可以是identity column类型,或者sequence类型或者table类型,取决于不同的底层数据库. 例如mysql会使用auto_increment;如果oracle数据库,则使用hibernate_sequence. (2)TABLE - 使用表保存id值(也就是会为应用的表创建一张专门保存Id的表,记录对应的表的对应最大的ID值) (3)IDENTITY - identity column (4)S

(九)Hibernate 的复合主键

一.什么是复合主键? 一张表的主键是由多个字段组成,这个主键就被称为复合主键.  主键是唯一确定某条记录的字段,比如公民的身份证号就是一个主键,因为由身份证号这个主键就可以确定 某个公民.   有一种情况,比如学生成绩这张表中,一个学号无法唯一确定这个学生的成绩,因为这个学生有多科成绩,这时候"学号+学科"才是主键,两者结合才能唯一确定一条记录,也就是成绩. 二.hibernate生成含有复合主键表的映射bean 2.1 创建有复合主键的表   这张表有复合主键 2.2 生成映射文件

hibernate映射-基于主键映射的1-1关联关系

(学习记录,错误不足之处,请您耐心指正^_^) hibernate映射-基于主键映射的1-1关联关系 基于主键的映射策略:指一端的主键生成器使用foreign策略,表明根据对方的主键来生成自己的主键,自己并不独立生成主键. 一.代码示例: {类文件↓} Manager.class 1 package com.zit.hibernate.one2one.primary; 2 3 public class Manager { 4 5 private Integer mgrId; 6 private

Hibernate常用的主键生成策略

1.自动增长identity 适用于MySQL.DB2.SQL Server,采用数据库生成的主键,用于为long.short.int类型生成唯一标识 使用SQL Server 和 MySQL 的自增字段,这个方法不能放到 Oracle 中,Oracle 不支持自增字段,要设定sequence(MySQL 和 SQL Server 中很常用) 数据库中的语法如下: MySQL:create table t_user(id int auto_increment primary key, name

hibernate里联合主键composite-id映射,查询单个主键的问题(转)

今天项目中遇到这个问题,搞了大半天,我郁闷...hibernate里联合主键配置(多个字段一起作为主键) <class name="com.cskj.hibernate.map.BbWjjc" table="bb_wjjc" schema="dbo" catalog="wjgl">        <composite-id name="id" class="com.cskj.hi

hibernate里联合主键composite-id映射,查询单个主键的问题

今天项目中遇到这个问题,搞了大半天,现在记录下来hibernate里联合主键配置(多个字段一起作为主键) <class name="com.cskj.hibernate.map.BbWjjc" table="bb_wjjc" schema="dbo" catalog="wjgl"> <composite-id name="id" class="com.cskj.hibernate