2 penweizgx002 penweizgx002 于 2015.07.24 16:01 提问

Hibernate4 复合主键没法使用缓存啊

代码如下,在执行查询的时候,缓存无效果,非复合主键的都正常进入缓存

 @Embeddable 
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class StudentClassesPK implements Serializable{
    private static final long serialVersionUID = 8086967036014159916L;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name = "student_id",referencedColumnName="id",nullable=true)  
    private Student student;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name = "classes_id",referencedColumnName="id",nullable=true )  
    private Classes classes;
    /**
     * 进入某个班级的时间
     */
    private Date startDate = new Date();

    public StudentClassesPK(){

    }

    public Student getStudent() {
        return student;
    }
    public void setStudent(Student student) {
        this.student = student;
    }
    public Classes getClasses() {
        return classes;
    }
    public void setClasses(Classes classes) {
        this.classes = classes;
    }

    public Date getStartDate() {
        return startDate;
    }

    public void setStartDate(Date startDate) {
        this.startDate = startDate;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((classes == null) ? 0 : classes.hashCode());
        result = prime * result + ((startDate == null) ? 0 : startDate.hashCode());
        result = prime * result + ((student == null) ? 0 : student.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        StudentClassesPK other = (StudentClassesPK) obj;
        if (classes == null) {
            if (other.classes != null)
                return false;
        } else if (!classes.equals(other.classes))
            return false;
        if (startDate == null) {
            if (other.startDate != null)
                return false;
        } else if (!startDate.equals(other.startDate))
            return false;
        if (student == null) {
            if (other.student != null)
                return false;
        } else if (!student.equals(other.student))
            return false;
        return true;
    }

    @Override
    public String toString() {
        return "StudentClassesPK [student=" + student + ", classes=" + classes + ", startDate=" + startDate + "]";
    }
}
 @Entity
@Table(name="T_ClassesStudent")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE,region="com.kmp.business.entity.StudentClasses")
public class StudentClasses extends BaseEntity{
    private static final long serialVersionUID = -6300584354851171783L;

    @EmbeddedId
    StudentClassesPK pk = new StudentClassesPK();

    /**
     * 离开某个班级的时间
     */
    private Date endDate;

    public StudentClassesPK getPk() {
        return pk;
    }
    public void setPk(StudentClassesPK pk) {
        this.pk = pk;
    }

    public Date getEndDate() {
        return endDate;
    }
    public void setEndDate(Date endDate) {
        this.endDate = endDate;
    }
    @Override
    public String toString() {
        return "StudentClasses [pk=" + pk + ", endDate=" + endDate + "]";
    }

1个回答

CSDNXIAOD
CSDNXIAOD   2015.07.24 16:06

Hibernate 使用复合主键
----------------------biu~biu~biu~~~在下问答机器人小D,这是我依靠自己的聪明才智给出的答案,如果不正确,你来咬我啊!

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
Hibernate4学习总结(3)--注解形式的基础映射,主键映射,基本属性映射,复合属性映射,继承映射。
Hibernate Annotation即hibernate注解,可以通过另一种方式将持久化类转化成表的相关信息,可以简化hibernate的配置文件。本文主要对Hibernate的注解进行讲解,由于篇幅原因,将注解部分分为两篇文章来写。集合映射和关联关系映射将在后面一文讲解。本文包括以下五个部分: 基础映射。主键映射。基本属性映射。复合属性映射。继承映射。 一、基础映射(注解
mysql为什么要有复合主键?
应用于补充 一般情况只要有个订单号bill_no做主键就可以了,现在要求可能会有补充订单,使用相同的订单号,那么这时单独使用订单号就不可以了,因为会有重复。那么你可以再使用个订单序列号bill_seq来作为区别。把bill_no和bill_seq设成复合主键。即使bill_no相同,bill_seq不同也是可以的。
Nhibernate 复合主键的的用法
Asp.Net MVC 中 用Nhibernate 复合主键的的用法,复合主键必须在 类中重写,即 在类中加入以下代码:           public override bool Equals(object obj)         {             return base.Equals(obj);         }         public overrid
Hibernate实现复合主键的使用
复合主键的使用 1>:首先将要作为主键的属性首先抽取成单独的实体 并提供get And set方法 并且还需要序列化 2>:在实际的实体中申明主键实体的变量 3>:在映射文件中编写实体的配置文件
JPA复合主键使用
数据库表create table RENT_CERT_VENDOR_TYPE ( CERT_TYPE_ID NUMBER not null, VENDOR_ID NUMBER not null, CERT_TYPE_VENDOR_ID NUMBER not null ) ; alter table RENT_CERT_VENDOR_TYPE add constraint PK_RENT_CERT_VENDOR_TYPE primary key
数据库设计 联合主键设为外键的问题
很多时候我们在数据库设计中都会遇到这样的问题: 有两个表 ,例如(红色的是主键) 学生(学号,姓名,性别,专业号,班级号) student (sno,sname,sex,spno,class_no); 专业(专业号,专业名称,上课学时); department(spno,sname,semester); 班级:(专业号,班级号,班主任); class(spno,class_no,h
复合主键的查询方法
  映射文件都是eclipse自动生成,包括Users.java 和 UserPK.java。 这边就不贴出来了假如USERS表的主键为NAME字段,TEL字段和AGE字段,那么在User类中也应该存在相对应的属性和方法,映射方法如下: "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/
jpa复合主键的使用 【转载】
文章出处:jpa复合主键的使用 AirLinePk复合主键类 package com.ljq.entity; import javax.persistence.Column; import javax.persistence.Embeddable; /** * 使用复合主键要满足的条件 * * 1、要实现序列化 2、提供默认的构造方法 3、实现hashCope *
复合主键与联合主键
一、复合主键   所谓的复合主键 就是指你表的主键含有一个以上的字段组成,不使用无业务含义的自增id作为主键。 比如  create table test ( name varchar(19), id number, value varchar(10), primary key (name,id) ) 上面的name和id字段组合起来就是你
@注解_复合主键
直接上代码咯 package cn.jbit.test2.bean; import java.io.Serializable; import javax.persistence.Embeddable; @Embeddable public class UserId implements Serializable { private static final long serialVer