举例
拿一个论坛项目来举例。
(1)用户点赞回复,一个用户可以点赞多个回复,同时一个回复可以被多个用户点赞,因此帖子和用户之间的关系就是多对多的关系。
(2)再来个例子,用户和帖子之间关系又是什么呢?用户可以发布多个帖子,一个帖子也可以被多个用户所回复,因此在这个例子里帖子和用户也是多对多的关系。
那么这两个例子有什么区别呢?
一个用户点赞一个回复只能点赞一次,不能重复点赞同一个回复。
一个用户回复一个帖子,可以多次回复。
乍一看好像没什么区别,但要解释清楚就要引入一个知识,“联合主键”。
联合主键
什么叫联合主键呢?
接着之前的例子,取用户的标识为userid,帖子的标识pasteid,某条回复的标识为answerid,联合主键就是把这两个字段联合作为主键,当一个001的用户点赞了002的帖子后,如果他再次点赞,就会生成一条主键相同的数据,违背了主键的唯一性原则,这是不行的。
如果001点赞了003,这样是可以的,只要保证两个联合的字段不同时相同就没问题。
不过要注意的是,这两个键都是别的表的主键,相当于引入了两张表的主键,这就叫联合主键。
实体层
那么实体层怎么写?给这两个字段分别设置对象?hbm.xml中主键是一对一的,不允许我们设置两个。
public class Praise {
private User user;
private Answer answer;
}
建议新建一个包,创建一个主键类,要实现 可序列化的接口。
//实现 可序列化 的接口
public class PrimaryKey implements Serializable {
private User user;
private Answer answer;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public Answer getAnswer() {
return answer;
}
public void setAnswer(Answer answer) {
this.answer = answer;
}
}
然后在实体层的类中就可以直接引用了。
public class Praise {
private PrimaryKey primaryKey;
public PrimaryKey getPrimaryKey() {
return primaryKey;
}
public void setPrimaryKey(PrimaryKey primaryKey) {
this.primaryKey = primaryKey;
}
}
hbm.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.zsj.domain">
<!-- 类名 对应表名 -->
<class name="Praise" table="praise">
<!-- 联合主键配置方式 -->
<composite-id name="primaryKey" class="com.zsj.vo.PrimaryKey">
<!-- primarykey中的属性 对应数据库中的列 属性对应的类 -->
<key-many-to-one name="user" column="userid" class="User"></key-many-to-one>
<key-many-to-one name="answer" column="answerid" class="Answer"></key-many-to-one>
</composite-id>
</class>
</hibernate-mapping>
本文地址:https://blog.csdn.net/qq_45187522/article/details/108565449