欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

什么是联合主键?ssh中怎么添加联合主键?

程序员文章站 2022-03-09 21:57:39
举例拿一个论坛项目来举例。(1)用户点赞回复,一个用户可以点赞多个回复,同时一个回复可以被多个用户点赞,因此帖子和用户之间的关系就是多对多的关系。(2)再来个例子,用户和帖子之间关系又是什么呢?用户可以发布多个帖子,一个帖子也可以被多个用户所回复,因此在这个例子里帖子和用户也是多对多的关系。那么这两个例子有什么区别呢?一个用户点赞一个回复只能点赞一次,不能重复点赞同一个回复。一个用户回复一个帖子,可以多次回复。乍一看好像没什么区别,但要解释清楚就要引入一个知识,“联合主键”。联合主键什么叫...

举例

拿一个论坛项目来举例。

(1)用户点赞回复,一个用户可以点赞多个回复,同时一个回复可以被多个用户点赞,因此帖子和用户之间的关系就是多对多的关系。

(2)再来个例子,用户和帖子之间关系又是什么呢?用户可以发布多个帖子,一个帖子也可以被多个用户所回复,因此在这个例子里帖子和用户也是多对多的关系。

那么这两个例子有什么区别呢?

一个用户点赞一个回复只能点赞一次,不能重复点赞同一个回复。
一个用户回复一个帖子,可以多次回复。

乍一看好像没什么区别,但要解释清楚就要引入一个知识,“联合主键”。

联合主键

什么叫联合主键呢?

接着之前的例子,取用户的标识为userid,帖子的标识pasteid,某条回复的标识为answerid,联合主键就是把这两个字段联合作为主键,当一个001的用户点赞了002的帖子后,如果他再次点赞,就会生成一条主键相同的数据,违背了主键的唯一性原则,这是不行的。
什么是联合主键?ssh中怎么添加联合主键?什么是联合主键?ssh中怎么添加联合主键?

如果001点赞了003,这样是可以的,只要保证两个联合的字段不同时相同就没问题。
什么是联合主键?ssh中怎么添加联合主键?

什么是联合主键?ssh中怎么添加联合主键?

不过要注意的是,这两个键都是别的表的主键,相当于引入了两张表的主键,这就叫联合主键。

实体层

那么实体层怎么写?给这两个字段分别设置对象?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

相关标签: SSH java