`
busing
  • 浏览: 41512 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Hibernate 复合主键的映射问题

阅读更多
--角色权限关系表
create table role_power_relation(
	roleid int not null,
	powerid int not null,
	primary key(roleid,powerid)
	);

  此表有复合主键,Hibernate反向工程映射结果

<hibernate-mapping>
    <class name="com.qdhh.system.entity.RolePowerRelation" table="role_power_relation" catalog="curtain">
        <composite-id name="id" class="com.qdhh.system.entity.RolePowerRelation">
            <key-property name="roleid" type="integer">
                <column name="roleid" />
            </key-property>
            <key-property name="powerid" type="integer">
                <column name="powerid" />
            </key-property>
        </composite-id>
    </class>
</hibernate-mapping>

 

 

java 文件

 

public class RolePowerRelation implements Serializable{

	// Fields
	private Integer roleid;
	private Integer powerid;

	// Constructors

	/** default constructor */
	public RolePowerRelation() {
	}

	/** full constructor */
	public RolePowerRelation(Integer roleid, Integer powerid) {
		this.roleid = roleid;
		this.powerid = powerid;
	}
……省略get和set方法

 

junit测试代码

 

public class TestCurtainDAO extends TestCase{

	String[] xmls=new String[]{
							"D:\\Apache Software Foundation\\Tomcat 6.0\\webapps\\Curtain\\WEB-INF\\applicationContext.xml",
							"D:\\Apache Software Foundation\\Tomcat 6.0\\webapps\\Curtain\\WEB-INF\\applicationContext-action.xml",
							"D:\\Apache Software Foundation\\Tomcat 6.0\\webapps\\Curtain\\WEB-INF\\applicationContext-dao.xml"};
	
	BeanFactory factory=new FileSystemXmlApplicationContext(xmls);

	private CurtainHibernateDAO service;
	@Override
	protected void setUp() throws Exception {
		// TODO Auto-generated method stub
		super.setUp();
	}

	@Override
	protected void tearDown() throws Exception {
		// TODO Auto-generated method stub
		super.tearDown();
	}
	
	public void testFindAll()
	{
		service=(CurtainHibernateDAO)factory.getBean("curtainDAO");
		List<Curtain> curtains=service.findAll();
		for (Curtain curtain : curtains) {
			System.out.println(curtain.getTime()+"\t"+curtain.getSummary()+"\t"+curtain.getPropertyid()+"\t"+curtain.getBorrow()+"\t"+curtain.getLoan()+"\t"+curtain.getBalance());
		}
	}
	
}
此测试只是启动spring,只要启动spring就会报错的

 

测试结果

 

Caused by: org.hibernate.PropertyNotFoundException: Could not find a getter for id in class com.qdhh.system.entity.RolePowerRelation
	at org.hibernate.property.BasicPropertyAccessor.createGetter(BasicPropertyAccessor.java:282)
	at org.hibernate.property.BasicPropertyAccessor.getGetter(BasicPropertyAccessor.java:275)
	at org.hibernate.tuple.PropertyFactory.getGetter(PropertyFactory.java:168)
	at org.hibernate.tuple.PropertyFactory.buildIdentifierProperty(PropertyFactory.java:44)
	at org.hibernate.tuple.entity.EntityMetamodel.<init>(EntityMetamodel.java:123)
	at org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.java:434)
	at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:109)
	at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:55)
	at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:226)
	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1294)
	at org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory(LocalSessionFactoryBean.java:814)
	at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:732)
	at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:211)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1367)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1333)
	... 41 more
)
	

 

说明:

  Hibernate映射联合主键表的时候,会将联合主键抽取成一个类,查询记录是就按照联合主键方式方式来查找了。
    当然,我们也可也不让他抽取,如果没必要的话。

 

解决办法:

 
方法1.将hbm文件的   <composite-id name="id" class="com.qdhh.system.entity.RolePowerRelation">
改成 <composite-id >

方法2.创建一个复合主键的类

public class Key implements Serializable {   
    private int roleid;   
    private String powerid;   
       // 省略所有getter和setter方法   
} 

 

    修改hbm文件

<composite-id name="id" class="Key">

 

 

 

分享到:
评论

相关推荐

    hibernate复合主键映射

    复合主键映射 &lt;br&gt;通常将复合主键相关属性,单独抽取出来,建立一个独立的类 * 必须实现序列化接口 * 必须实现equals和hashcode方法 采用标签进行映射,其它属性采用正常映射

    hibernate 无主键表映射

    通过以上的解释,我们可以看到,虽然无主键表在数据库中并不常见,但在某些特定场景下,如复合主键,Hibernate提供了一套完整的解决方案。所提供的资源包括一个简单的Demo,可以实际运行并理解无主键表映射的实现...

    hibernate复合主键配置和使用

    《Hibernate复合主键配置与使用详解》 在Java开发中,Hibernate作为一款强大的ORM框架,大大简化了数据库操作。然而,当我们面临复杂的数据表结构,尤其是涉及到复合主键时,如何在Hibernate中进行配置和使用就显得...

    hibernate复合主键设置

    在Hibernate的映射文件(XML方式)或者使用JPA注解(Java方式)中,需要为复合主键提供相应的配置。对于XML配置,你可能会看到类似以下的设置: ```xml &lt;hibernate-mapping&gt; &lt;!-- 其他属性的映射 --&gt; ...

    hibernate复合主键的实例

    在Java的持久化框架Hibernate中,复合主键(Composite Key)是一种特殊的数据结构,用于处理具有多个字段作为唯一标识的情况。本实例将深入探讨如何在Hibernate中实现复合主键,并提供一个具体的示例来帮助理解。 ...

    Hibernate复合主键.

    本篇文章将深入探讨Hibernate如何支持和管理复合主键。 一、理解复合主键 在数据库设计中,复合主键是一种特殊情况,当单个字段不能唯一标识表中的每一行时,可以使用两个或多个字段的组合来创建唯一的标识。例如...

    Java的Hibernate框架中复合主键映射的创建和使用教程

    在Java的Hibernate框架中,复合主键映射是一种处理多列组合成主键的情况,它使得在数据库表中由两个或更多个字段组成的主键能够被正确地映射到实体类。在使用复合主键时,我们需要遵循一定的步骤和规则。 首先,...

    Hibernate复合主键

    ### Hibernate复合主键详解 在关系型数据库设计中,经常会出现使用多个字段组合起来作为主键的情况,这种类型的主键被称为复合主键。而在Java领域,尤其是使用Hibernate框架进行持久化操作时,复合主键的应用变得尤...

    hibernate集合的映射

    在Hibernate中,Map通常对应于数据库的复合主键或者关联表。配置示例: ```xml ``` 这里的`&lt;map&gt;`元素定义了一个名为`preferences`的Map集合,`&lt;key&gt;`元素对应外键,`&lt;map-key&gt;`元素指定Map的键列和类型,...

    Hibernate学习笔记

    Hibernate的映射标签和属性是其核心功能之一,其中&lt;hibernate-mapping&gt;标签用于定义映射文件的根元素,标签用于定义持久化类的映射,标签用于定义类的主键映射,标签用于定义类的属性映射。通过这些标签,可以创建...

    hibernate3 注释生成复合主键或者嵌入式主键的方法及实例.doc

    通过这种方式,Hibernate将知道如何处理`UserRole`类,将其映射到具有复合主键的数据库表。 3. 嵌入式主键(Embedded Id): 如果希望将主键字段作为实体类的一部分,而不是单独的类,可以使用`@EmbeddedId`和`@...

    Hibernate中对数据库复合主键的支持.pdf

    ### Hibernate中对数据库复合主键的支持 #### 一、引言 在软件开发过程中,特别是在J2EE领域中,Hibernate作为一种流行的ORM(Object-Relational Mapping)框架被广泛使用。ORM框架的主要作用是将关系型数据库中的...

    生成hibernate映射文件工具

    6. `&lt;join&gt;`:用于处理复合主键或者跨表的复杂映射。 生成工具的工作原理大致如下: 1. 连接数据库:工具会首先连接到指定的数据库,获取数据库的元数据信息,如表名、列名、约束等。 2. 分析表结构:根据数据库中...

    Hibernate关联映射

    总结来说,Hibernate的复合主键映射允许我们将由多个属性组成的主键映射到对象上,通过在映射配置文件中使用`&lt;composite-id&gt;`标签,并为每个主键属性创建`&lt;key-property&gt;`。此外,通过创建一个专门的主键类,我们...

    Hibernate 的关联映射

    - 使用外键:Hibernate支持实体间的外键关联,但也可以通过复合主键或联合主键实现。 - 级联操作:`cascade`属性可以配置为SAVE_UPDATE、PERSIST、MERGE、REMOVE等,决定操作一个实体时是否也影响关联的实体。 - ...

    Hibernate 相关映射关系

    5. **复合主键映射(Composite Key)** 当表的主键由多个字段组成时,需要使用复合主键。在Hibernate中,可以使用`@EmbeddedId`和`@Embeddable`注解来实现。例如,一个订单由订单号和产品ID共同构成主键。 6. **...

    Hibernate_关联关系映射配置

    `@EmbeddedId`用于指定实体的主键类,而`@Embeddable`则用于声明这个类为复合主键类。 六、延迟加载(Lazy Loading) Hibernate提供了延迟加载机制,可以按需加载关联对象,以提高性能。默认情况下,`@ManyToOne`...

Global site tag (gtag.js) - Google Analytics