有会员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)
会员有好友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)
解决方案 »
- 关于Java中的JTA与容器事务的疑问
- 各位大虾求助,在myeclipse 8.5中新建立一个web项目.......
- Web Application Server(was)服务器的问题
- 帮帮忙!S2SH整合问题?启动tomcat就出现异常
- 开源项目怎么参加啊?
- strus问题
- spring书籍介绍
- weblogic问题,如何关闭页面缓冲
- 是不是用了hibernate,就不用关心数据库的链接是否关闭这样的问题
- 用友ERP-NC、用友ERP-U8有什么区别吗?
- 异常了好几天了,求高人指点。(ExceptionInInitializerError Caused by: NullPointerException)
- 获得一个字符串中出现次数最多的子字符串及次数。子字符串不定长
<key-many-to-one name="friend" class="Member">
<column name="id" />
</key-many-to-one>
关键字 key 添加主键就不会报错啦... 加分
表中的键是这样的:
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映射表要改成怎样啊?
private Member friend;//好友
一张主数据表允许两个主键?联合主键算一主键,memberId又配作了主键,也就是说楼主这张表中出现三个字段都是主键,除了多对多关系表中有这种可能,其它还没见过这种设计。综合看感觉设计不合理。把需求告诉我们,或许可以帮助楼主。
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>
public class Member(){
private int id;
private String name;
private List <Member> friends;
}
嗯,这样设计就可以,即自己对自己产生一对多关系(会额外产生一个关系表);
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
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
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事务范围。
在实体里面缺少id啊
关于无限分类的CURD实现觉得挺难实现的.
考虑到(1),就像QQ一样,会员和会员都可能是好友,现在一个表,会员对会员是多对多的关系
(2)关于那个realName如何保存,如多个好友都设置了你的真名(并不一定是完全真正的姓名),那样不同好友对你的真实名字如何保存(你个人表中只有一个realName)!
11楼
加了id 还是不行!
-----------------------
现在我采用了JDBC方法实现
关于hibernate的实现哪位有高见就跟贴交流一下!