--角色权限关系表 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">