hibernate+jpa中的组合主键与系统表的实体映射

本文介绍了hibernate+jpa中如何处理组合主键,探讨了组合主键的设置方式,以及在实体映射系统表时的可行性。通过示例说明了使用多个Id注解和EmbeddedId注解的区别,并强调了正确设置主键以避免session冲突的重要性。此外,还分享了成功将系统表映射为实体的经验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

hibernate+jpa中的组合主键与系统表的实体映射

关于hibernate中的组合主键,相信很多人都已经很清楚了。
建立对应的ID实体并实现Serializable接口,在目标实体中加入ID对象并注解Id或EmbeddedId(具体可自行查阅)。
最近在项目实施中查阅资料时,发现注解EmbeddedId的解释:使用EmbeddedId注解时,只能有一个EmbeddedId注解且没有Id注解。反向思考使用Id注解时是不是可以存在多个Id注解且没有使用EmbeddedId注解。
使用hibernate保存实体时,可能会遇到一个错误:session已经存在了一个相同id的实体。这就是需要组合主键的地方,数据表可以不设置主键,实体却必须指定主键,hibernate在session中便是根据实体设置的主键来确定唯一对象。
既然这样,尝试一下:

	@Id
	@Column(name = "CZ_TAB_ID")
	private String czTabId;
	@Id
	@Column(name = "CZ_TAB_NAME")
	private String czTabName;
	@Column(name = "CZ_TAB_COMMENT")
	private String czTabComment;
	@Column(name = "CZ_TAB_ORDER")
	private int czTabOrder;

没错,完全可行。
好处也显而易见,不仅仅是少写一个id对象而已,使用过id对象的都能理解,复合主键的实体类必须重写equals和hashCode方法。单一主键时hibernate会帮我们比对对象,使用组合主键则需要程序员重写这些方法来比对对象。如果使用jpa工具直接对应表生成还好,如果自己手写实体,或者数据表主键设计不完善与业务需求的主键不一样就麻烦了。

下面是第二点,对系统表建立实体映射,经过上面的多Id注解以后我感觉可能hibernate并不是太严格,于是尝试了映射系统表对象。

@Entity
@Table(name = "ALL_TAB_COMMENTS")
public class AllTabComments implements Serializable {

	private static final long serialVersionUID = 1L;

	@Id
	@Column
	private String owner;
	@Id
	@Column(name = "TABLE_NAME")
	private String tableName;
	@Column(name = "TABLE_TYPE")
	private String tableType;
	@Column
	private String comments;

	get/set...
}

也是完全没问题,至于其它的系统表能否映射我就不管了,反正我用到的可以。^_^/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值