现有2张表:Userinfo(id<pk>主表),Role(id<pk>从表)通过userinfo_id(FK)与User一对一关联
Userinfo.hbm.xml:
<one-to-one name="role" class="vo.Role"  property-ref="userinfo"></one-to-one>
Role.hbm.xml:
<many-to-one name="userinfo" class="vo.Userinfo" fetch="select"unique="true" cascade="all">
    <column name="userInfo_id" length="32" not-null="true" />
</many-to-one>
现对Userinfo(主表)进行删除操作『表中已插入数据(插入操作没问题)』:
Userinfo user = userdao.findById("402880811a38c08e011a38c091470001");
userdao.delete(user);
报错:
INFO DefaultLoadEventListener:95 - Error performing load command
org.hibernate.HibernateException: More than one row with the given identifier was found: 402880811a38c08e011a38c091470001, for class: vo.Userinfo
请问各位怎么回事啊?!急啊!!

解决方案 »

  1.   

    记录不唯一不能使用load方法加载对象应该是数据库 userInfo表里面 id 为402880811a38c08e011a38c091470001 的 不知一个
      

  2.   

    我查了。。里头确实是只有一个(而且是主键)
    错误详细点的:
    20:20:25,171  INFO SessionFactoryImpl:154 - building session factory
    20:20:25,187  WARN Configurator:126 - No configuration found. Configuring ehcache from ehcache-failsafe.xml found in the classpath: jar:file:/E:/MyEclipse%206.0/myeclipse/eclipse/plugins/com.genuitec.org.hibernate.eclipse_6.0.1.zmyeclipse601200710/myeclipse-data/3.0/lib/ehcache-1.1.jar!/ehcache-failsafe.xml
    20:20:25,875  INFO SessionFactoryObjectFactory:82 - Not binding factory to JNDI, no JNDI name configured
    20:20:25,937 DEBUG SQL:346 - select userinfo0_.id as id7_4_, userinfo0_.userName as userName7_4_, userinfo0_.password as password7_4_, userinfo0_.realName as realName7_4_, userinfo0_.sex as sex7_4_, userinfo0_.phone as phone7_4_, userinfo0_.email as email7_4_, role1_.id as id3_0_, role1_.userInfo_id as userInfo2_3_0_, role1_.roleName as roleName3_0_, addressboo2_.id as id0_1_, addressboo2_.User_id as User2_0_1_, addressboo2_.name as name0_1_, addressboo2_.person_name as person4_0_1_, addressboo2_.person_phone as person5_0_1_, addressboo2_.person_qq as person6_0_1_, addressboo2_.person_address as person7_0_1_, revbox3_.id as id2_2_, revbox3_.User_id as User2_2_2_, revbox3_.smsPhone as smsPhone2_2_, revbox3_.smsContext as smsContext2_2_, revbox3_.smsTime as smsTime2_2_, sendbox4_.id as id5_3_, sendbox4_.User_ID as User2_5_3_, sendbox4_.recNumber as recNumber5_3_, sendbox4_.recContext as recContext5_3_, sendbox4_.sendTime as sendTime5_3_ from infoplat.userinfo userinfo0_ left outer join infoplat.role role1_ on userinfo0_.id=role1_.userInfo_id left outer join infoplat.addressbook addressboo2_ on userinfo0_.id=addressboo2_.User_id left outer join infoplat.revbox revbox3_ on userinfo0_.id=revbox3_.User_id left outer join infoplat.sendbox sendbox4_ on userinfo0_.id=sendbox4_.User_ID where userinfo0_.id=?
    Hibernate: select userinfo0_.id as id7_4_, userinfo0_.userName as userName7_4_, userinfo0_.password as password7_4_, userinfo0_.realName as realName7_4_, userinfo0_.sex as sex7_4_, userinfo0_.phone as phone7_4_, userinfo0_.email as email7_4_, role1_.id as id3_0_, role1_.userInfo_id as userInfo2_3_0_, role1_.roleName as roleName3_0_, addressboo2_.id as id0_1_, addressboo2_.User_id as User2_0_1_, addressboo2_.name as name0_1_, addressboo2_.person_name as person4_0_1_, addressboo2_.person_phone as person5_0_1_, addressboo2_.person_qq as person6_0_1_, addressboo2_.person_address as person7_0_1_, revbox3_.id as id2_2_, revbox3_.User_id as User2_2_2_, revbox3_.smsPhone as smsPhone2_2_, revbox3_.smsContext as smsContext2_2_, revbox3_.smsTime as smsTime2_2_, sendbox4_.id as id5_3_, sendbox4_.User_ID as User2_5_3_, sendbox4_.recNumber as recNumber5_3_, sendbox4_.recContext as recContext5_3_, sendbox4_.sendTime as sendTime5_3_ from infoplat.userinfo userinfo0_ left outer join infoplat.role role1_ on userinfo0_.id=role1_.userInfo_id left outer join infoplat.addressbook addressboo2_ on userinfo0_.id=addressboo2_.User_id left outer join infoplat.revbox revbox3_ on userinfo0_.id=revbox3_.User_id left outer join infoplat.sendbox sendbox4_ on userinfo0_.id=sendbox4_.User_ID where userinfo0_.id=?
    20:20:26,000  INFO DefaultLoadEventListener:95 - Error performing load command
    org.hibernate.HibernateException: More than one row with the given identifier was found: 402880811a38c08e011a38c091470001, for class: vo.Userinfo
    at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:68)
    at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:41)
    at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:2730)
    at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:365)
    at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:346)
    at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:123)
    at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:177)
    at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:87)
    at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:862)
    at org.hibernate.impl.SessionImpl.get(SessionImpl.java:799)
    at dao.UserinfoDAO.findById(UserinfoDAO.java:69)
    at test.UserInfoTest.testDelete(UserInfoTest.java:41)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at junit.framework.TestCase.runTest(TestCase.java:164)
    at junit.framework.TestCase.runBare(TestCase.java:130)
    at junit.framework.TestResult$1.protect(TestResult.java:106)
    at junit.framework.TestResult.runProtected(TestResult.java:124)
    at junit.framework.TestResult.run(TestResult.java:109)
    at junit.framework.TestCase.run(TestCase.java:120)
    at junit.framework.TestSuite.runTest(TestSuite.java:230)
    at junit.framework.TestSuite.run(TestSuite.java:225)
    at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
    20:20:26,015 ERROR UserinfoDAO:72 - get failed
      

  3.   

    是啊!这是我的配置文件
    Userinfo.hbm.xml: 
    <one-to-one name="role" class="vo.Role"  property-ref="userinfo"> </one-to-one> 
    Role.hbm.xml: 
    <many-to-one name="userinfo" class="vo.Userinfo" fetch="select"unique="true" cascade="all"> 
        <column name="userInfo_id" length="32" not-null="true" /> 
    </many-to-one> 
      

  4.   

    one-to-one 加注 constrained="true"
      

  5.   

    Userinfo Role User 觉得还是表设计的有些问题 Userinfo 是什么表?我认为权限系统有Role和User就够了啊
      

  6.   

    主键怎么可能有重复呢,确认下是否真的有重复的,错不在hibernate而在于对象设计和数据库关系约束。
      

  7.   

    Role.java:
            private String id;
    private Userinfo userinfo;
    private String roleName;
    private Set roleModules = new HashSet(0);
    userinfo.java:
    private String id;
    private String userName;
    private String password;
    private String realName;
    private String sex;
    private String email;
    private String phone;
    private Role role;
    private Addressbook addressbook;
    private Revbox revbox;
    private Sendbox sendbox;
    private Set specialnumbers = new HashSet(0);
    数据库:
    create table Role
    (
       id                   varchar(32) not null,
       roleName             varchar(50) not null,
       userInfo_id          varchar(32) not null,//是不是这个问题?
       primary key (id)
    );
    create table userInfo
    (
       id                   varchar(32) not null,
       userName             varchar(32) not null,
       password             varchar(16) not null,
       realName             varchar(50) not null,
       sex                  varchar(10) not null,
       phone                varchar(16) not null,
       email                varchar(50) not null,
       primary key (id)
    );
    另外。。要想使用MYSQL的级联更新或删除是否将restrict改为CASCADE?
    alter table Role add constraint FK_Reference_5 foreign key (userInfo_id)
          references userInfo (id) on delete restrict on update restrict;