用户登录
用户注册

分享至

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

  • 作者: 天使在抠脚-
  • 来源: 51数据库
  • 2021-07-29

举例

拿一个论坛项目来举例。

(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>
软件
前端设计
程序设计
Java相关