您的位置:首页 > 其它

Hibernate复合主键(注解)操作分区数据表

2015-07-02 16:58 381 查看
1. 首先创建分区数据表(详见:MySQL按日期月份分区实例详解

2. 创建复合主键的组件类

需要注意@Embeddable用来标示此类是复合主键类,必须要覆盖equals和hashCode两个方法

@Embeddable
public class TestId implements Serializable {
	private static final long serialVersionUID = -1875863517212408875L;
	private Integer id;
	private Date date;

	//getter、setter方法省略
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		final <span style="font-family:Arial, Helvetica, sans-serif;">TestId </span><span style="font-family:Arial, Helvetica, sans-serif;">other = (TestId) obj;</span>
		if (id == other.id && date == other.date)
			return true;
		return false;
	}

	@Override
	public int hashCode() {
		int result = id.hashCode() + date.hashCode();
		return result;
	}

}


3. 创建POJO类(与数据库对应)

注意@IdClass(TestId.class)

@Entity
@IdClass(TestId.class)
@Table(name = "test")
public class Test
{
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "id")
	private Integer id;
	@Id
	@Column(name = "date")
	private Date date;
	
	@Column(name = "desc")
	private String desc;

	//getters and setters
}


4. 测试增删改查

注意如果单单定义POJO类,那么在update的时候会出现“Duplicate ‘’ primary key”这种诡异的错误,定义好联合主键后,增删改查操作全部正常进行,这里以Spring+hibernate的方式为例

@Resource(name = "sessionFactory")
protected SessionFactory sessionFactory;
protected Session getSession() {
	return sessionFactory.getCurrentSession();
 }
//增
public Serializable save(Test t){
	getSession().save(t);
}
//删
publc void delete(Test t){
	getSession().delete(t);
}
//改
public void update(Test t){
	getSession().update(t);
}
//查
public Test getTestById(TestId tId){
	getSession().load(tId);
}


注:如果测试中发现问题欢迎在下方提问,大家一起讨论
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: