有会员Member表,
会员有好友Friend表
好友表中有复合主键,同时也是Member的外键
这样的关系如何写映射?下面自己写的,有错误
Model
-----------------------
public class Member(){
    private int id;
    private String name;
}
public class Friend(){
    private int memberId;//会员id
    private Member friend;//好友
    private String friendTrueName;//好友真实姓名
}映射文件
-------------------------------------
<class name="Member" table="Member" schema="dbo" catalog="flyq">
    <id name="id" type="java.lang.Integer">
        <column name="id" />
        <generator class="native"></generator>
    </id>
    <property name="name" type="java.lang.String">
        <column name="name" length="20" not-null="true" />
    </property>
</class><class name="Friend" table="Friend">
        <composite-id name="id">
            <key-property name="memberId" type="java.lang.Integer"/>
            <key-many-to-one name="friend" class="Member">
                <column name="id" />
            </key-many-to-one>
        </composite-id>
        <property name="friendTrueName" type="java.lang.String">
            <column name="friendTrueName" length="20" />
        </property>
    </class>错误信息
-----------------------------------------------------
%%%% Error Creating SessionFactory %%%%
org.hibernate.InvalidMappingException: Could not parse mapping document from resource com/group6/flyq/model/Friend.hbm.xml
at org.hibernate.cfg.Configuration.addResource(Configuration.java:569)
at org.hibernate.cfg.Configuration.parseMappingElement(Configuration.java:1587)
at org.hibernate.cfg.Configuration.parseSessionFactory(Configuration.java:1555)
at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1534)
at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1508)
at org.hibernate.cfg.Configuration.configure(Configuration.java:1428)
at com.group6.flyq.util.HibernateSessionFactory.<clinit>(HibernateSessionFactory.java:16)
at com.group6.flyq.dao.impl.MemberDaoHibImpl.<init>(MemberDaoHibImpl.java:17)
at com.group6.flyq.test.Test.main(Test.java:10)
Caused by: org.hibernate.PropertyNotFoundException: field [id] not found on com.group6.flyq.model.Friend
at org.hibernate.property.DirectPropertyAccessor.getField(DirectPropertyAccessor.java:122)
at org.hibernate.property.DirectPropertyAccessor.getField(DirectPropertyAccessor.java:114)
at org.hibernate.property.DirectPropertyAccessor.getGetter(DirectPropertyAccessor.java:137)
at org.hibernate.util.ReflectHelper.getter(ReflectHelper.java:83)
at org.hibernate.util.ReflectHelper.reflectedPropertyClass(ReflectHelper.java:71)
at org.hibernate.cfg.HbmBinder.reflectedPropertyClass(HbmBinder.java:1696)
at org.hibernate.cfg.HbmBinder.bindComponent(HbmBinder.java:1808)
at org.hibernate.cfg.HbmBinder.bindCompositeId(HbmBinder.java:1726)
at org.hibernate.cfg.HbmBinder.bindCompositeId(HbmBinder.java:424)
at org.hibernate.cfg.HbmBinder.bindRootPersistentClassCommonValues(HbmBinder.java:338)
at org.hibernate.cfg.HbmBinder.bindRootClass(HbmBinder.java:273)
at org.hibernate.cfg.HbmBinder.bindRoot(HbmBinder.java:144)
at org.hibernate.cfg.Configuration.add(Configuration.java:669)
at org.hibernate.cfg.Configuration.addInputStream(Configuration.java:504)
at org.hibernate.cfg.Configuration.addResource(Configuration.java:566)
... 8 more
%%%% Error Creating SessionFactory %%%%
org.hibernate.InvalidMappingException: Could not parse mapping document from resource com/group6/flyq/model/ChatLog.hbm.xml
at org.hibernate.cfg.Configuration.addResource(Configuration.java:569)
at org.hibernate.cfg.Configuration.parseMappingElement(Configuration.java:1587)
at org.hibernate.cfg.Configuration.parseSessionFactory(Configuration.java:1555)
at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1534)
at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1508)
at org.hibernate.cfg.Configuration.configure(Configuration.java:1428)
at com.group6.flyq.util.HibernateSessionFactory.rebuildSessionFactory(HibernateSessionFactory.java:44)
at com.group6.flyq.util.HibernateSessionFactory.getSession(HibernateSessionFactory.java:32)
at com.group6.flyq.dao.impl.MemberDaoHibImpl.<init>(MemberDaoHibImpl.java:17)
at com.group6.flyq.test.Test.main(Test.java:10)
Caused by: org.hibernate.DuplicateMappingException: Duplicate class/entity mapping com.group6.flyq.model.ChatLog
at org.hibernate.cfg.Mappings.addClass(Mappings.java:118)
at org.hibernate.cfg.HbmBinder.bindRoot(HbmBinder.java:145)
at org.hibernate.cfg.Configuration.add(Configuration.java:669)
at org.hibernate.cfg.Configuration.addInputStream(Configuration.java:504)
at org.hibernate.cfg.Configuration.addResource(Configuration.java:566)
... 9 more
Exception in thread "main" java.lang.NullPointerException
at com.group6.flyq.dao.impl.MemberDaoHibImpl.load(MemberDaoHibImpl.java:34)
at com.group6.flyq.test.Test.main(Test.java:11)

解决方案 »

  1.   

      你 Friend表 没主键肯定会多 出
                               <key-many-to-one name="friend" class="Member"> 
                    <column name="id" /> 
                </key-many-to-one> 
      关键字  key  添加主键就不会报错啦...  加分
      

  2.   

    不是很明白啊!
    表中的键是这样的:
    alter table Friend
    add 
    constraint PK_Friend_memberId_friendId primary key(memberId,friendId),
    constraint FK_Friend_memberId foreign key(memberId) references Member(id),
    constraint FK_Friend_friendId foreign key(friendId) references Member(id)
    Friend映射表要改成怎样啊?
      

  3.   

    private int memberId;//会员id 
    private Member friend;//好友
    一张主数据表允许两个主键?联合主键算一主键,memberId又配作了主键,也就是说楼主这张表中出现三个字段都是主键,除了多对多关系表中有这种可能,其它还没见过这种设计。综合看感觉设计不合理。把需求告诉我们,或许可以帮助楼主。
      

  4.   

    Member类:
    public class Member(){ 
        private int id; 
        private String name; 
        private List<Member> friends;
    } <class name="Member" table="Member" schema="dbo" catalog="flyq"> 
        <id name="id" type="java.lang.Integer"> 
            <column name="id" /> 
            <generator class="native"> </generator> 
        </id> 
        <property name="name" type="java.lang.String"> 
            <column name="name" length="20" not-null="true" /> 
        </property> 
        <bag name="friends" inverse="true">
            <key>
                <column name="memberId" not-null="true" />
            </key>
            <one-to-many class="Friend" />
        </bag>
    </class> 
      

  5.   

    Member类: 
    public class Member(){ 
        private int id; 
        private String name; 
        private List <Member> friends; 

    嗯,这样设计就可以,即自己对自己产生一对多关系(会额外产生一个关系表);
      

  6.   

    Member类: 
    public class Member(){ 
        private int id; 
        private String name; 
        private List <Member> friends; 
    } <class name="Member" table="Member" schema="dbo" catalog="flyq"> 
        <id name="id" type="java.lang.Integer"> 
            <column name="id" /> 
            <generator class="native"> </generator> 
        </id> 
        <property name="name" type="java.lang.String"> 
            <column name="name" length="20" not-null="true" /> 
        </property> 
        <bag name="friends" inverse="true"> 
            <key> 
                <column name="memberId" not-null="true" /> 
            </key> 
            <one-to-many class="Friend" /> 
        </bag> 
    </class>
    -------------------- 
    Friend类
    public class Friend(){ 
        private int memberId;//会员id 
        private Member friend;//好友 ,也是会员
        private String friendTrueName;//好友真实姓名 
    } <class name="Friend" table="Friend"> 
            <composite-id name="id"> 
                <key-property name="memberId" /> 
                <key-many-to-one name="friend" class="Member"> 
                    <column name="id" /> 
                </key-many-to-one> 
            </composite-id> 
            <property name="friendTrueName" type="java.lang.String"> 
                <column name="friendTrueName" length="20" /> 
            </property> 
    </class> 
    这样有什么问题吗?
    为什么说Friend.hbm.xml出错
    %%%% Error Creating SessionFactory %%%% 
    org.hibernate.InvalidMappingException: Could not parse mapping document from resource com/group6/flyq/model/Friend.hbm.xml 
    at org.hibernate.cfg.Configuration.addResource(Configuration.java:569) 
    at org.hibernate.cfg.Configuration.parseMappingElement(Configuration.java:1587) 
    at org.hibernate.cfg.Configuration.parseSessionFactory(Configuration.java:1555) 
    at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1534) 
    at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1508) 
    at org.hibernate.cfg.Configuration.configure(Configuration.java:1428) 
    at com.group6.flyq.util.HibernateSessionFactory. <clinit>(HibernateSessionFactory.java:16) 
    at com.group6.flyq.dao.impl.MemberDaoHibImpl. <init>(MemberDaoHibImpl.java:17) 
    at com.group6.flyq.test.Test.main(Test.java:10) 
    Caused by: org.hibernate.PropertyNotFoundException: field [id] not found on com.group6.flyq.model.Friend 
    at org.hibernate.property.DirectPropertyAccessor.getField(DirectPropertyAccessor.java:122) 
    at org.hibernate.property.DirectPropertyAccessor.getField(DirectPropertyAccessor.java:114) 
    at org.hibernate.property.DirectPropertyAccessor.getGetter(DirectPropertyAccessor.java:137) 
    at org.hibernate.util.ReflectHelper.getter(ReflectHelper.java:83) 
    at org.hibernate.util.ReflectHelper.reflectedPropertyClass(ReflectHelper.java:71) 
    at org.hibernate.cfg.HbmBinder.reflectedPropertyClass(HbmBinder.java:1696) 
    at org.hibernate.cfg.HbmBinder.bindComponent(HbmBinder.java:1808) 
    at org.hibernate.cfg.HbmBinder.bindCompositeId(HbmBinder.java:1726) 
    at org.hibernate.cfg.HbmBinder.bindCompositeId(HbmBinder.java:424) 
    at org.hibernate.cfg.HbmBinder.bindRootPersistentClassCommonValues(HbmBinder.java:338) 
    at org.hibernate.cfg.HbmBinder.bindRootClass(HbmBinder.java:273) 
    at org.hibernate.cfg.HbmBinder.bindRoot(HbmBinder.java:144) 
    at org.hibernate.cfg.Configuration.add(Configuration.java:669) 
    at org.hibernate.cfg.Configuration.addInputStream(Configuration.java:504) 
    at org.hibernate.cfg.Configuration.addResource(Configuration.java:566) 
    ... 8 more 
      

  7.   

    Friend类不要,Friend本身就是Member。举个例子:做无限分类的时候,就是自己对自己,一个父类有多个子类,多个子类对应一个父类。Member类: 
    public class Member(){ 
        private int id; 
        private String name; 
        private String realName;//真实姓名
        private List <Member> friends; //好友,好友也是Member
        private Member me;//我,与friends建立一对多关系。
    } 可参考我这篇文章——《无限分类的CURD实现》:
    http://howsun.blog.sohu.com/120680525.html
      

  8.   

    好友是谁的?肯定是me的。我很少用xml来映射,《无限分类的CURD实现》一文中用的注解映射,参考一下吧,用xml描述也是一样的。下面用注解方式演示一下:@Entity
    public class Member(){     @Id
        @GeneratedValue
        @Column(name="id_")
        private int id;     @Column(name="name_",nullable=false,length=50)
        private String name;     @Column(name="realName_",nullable=false,length=50)
        private String realName;//真实姓名     @OneToMany(cascade={CascadeType.REFRESH,CascadeType.REMOVE},mappedBy="me")//与me建立关系
        private List <Member> friends; //好友    @ManyToOne(cascade=CascadeType.REFRESH)
        @JoinColumn(name="me_")
        private Member me;//我
    } 查看我的好友:
    List<Member> myFriends = orm.find("from Member where me=?");
    注意:me = new Member(我的id);或者 Member me = orm.getObject(我的id);
    List<Member> myFriends = me.getFriends();
    但这种方式必须考虑到实时加载,懒加载时要注意orm.session事务范围。
      

  9.   

    org.hibernate.PropertyNotFoundException: field [id] not found on com.group6.flyq.model.Friend 
    在实体里面缺少id啊
      

  10.   

    10楼
    关于无限分类的CURD实现觉得挺难实现的.
    考虑到(1),就像QQ一样,会员和会员都可能是好友,现在一个表,会员对会员是多对多的关系
    (2)关于那个realName如何保存,如多个好友都设置了你的真名(并不一定是完全真正的姓名),那样不同好友对你的真实名字如何保存(你个人表中只有一个realName)!
    11楼
    加了id 还是不行!
    -----------------------
    现在我采用了JDBC方法实现
    关于hibernate的实现哪位有高见就跟贴交流一下!