随笔 - 55  文章 - 187  trackbacks - 0
<2009年2月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
1234567

常用链接

留言簿(12)

随笔分类

随笔档案

groovy

搜索

  •  

最新评论

阅读排行榜

评论排行榜

在设计数据库表的时候,往往会设计出带有复合主键的表,即表的记录由多个字段联合标识,如:


CREATE TABLE TB_HOUR_DATA
(
  STAT_DATE  DATE                   NOT NULL,
  PATH_ID    NUMBER(
20)             NOT NULL,
  VALUE      VARCHAR2(
512 BYTE),
  TYPE       NUMBER(
1)              NOT NULL
)
其中,复合主键为(STAT_DATE,PATH_ID,TYPE)

针对这种情况,hibernate(jpa) 的 annotation 映射声明如下:
1、复合主键类HourDataPK
package net.kong.wolf.stat.db.entity;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Embeddable
public class HourDataPK implements Serializable {

    
/**
     * 
     
*/

    
private static final long serialVersionUID = 1L;

    @ManyToOne
    @JoinColumn(name 
= "path_id", nullable = false)
    
private Path path;

    @Column(name 
= "stat_date")
    @Temporal(TemporalType.DATE)
    
private Date statDate;

    
private int type;

    
public Path getPath() {
        
return path;
    }


    
public void setPath(Path path) {
        
this.path = path;
    }


    
public Date getStatDate() {
        
return statDate;
    }


    
public void setStatDate(Date statDate) {
        
this.statDate = statDate;
    }


    
public int getType() {
        
return type;
    }


    
public void setType(int type) {
        
this.type = type;
    }

}


2、实体类HourData:
package net.kong.wolf.stat.db.entity;

import java.io.Serializable;

import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.Table;

import net.kong.wolf.stat.core.Text;

@Entity
@Table(name 
= "TB_HOUR_DATA")
public class HourData implements Serializable {

    
/**
     * 
     
*/

    
private static final long serialVersionUID = 1L;

    @EmbeddedId
    
private HourDataPK pk;

    
private String value;

    
public String getValue() {
        
return value;
    }


    
public void setValue(String value) {
        
this.value = value;
    }


    
public int[] getHours() {
        
return parseValue(value);
    }


    
private int[] parseValue(String value) {
        
int[] result = new int[24];
        
for (int i = 0; i < 24; i++{
            result[i] 
= -1;
        }

        
if (value == null{
            
return result;
        }

        String[] hs 
= Text.splitCSV(value);
        
int len = Math.min(24, hs.length);
        
for (int i = 0; i < len; i++{
            result[i] 
= Text.parseInt(hs[i], -1);
        }

        
return result;
    }


    
public void setHours(int[] hours) {
        
int[] tHours = parseValue(value);
        StringBuilder sb 
= new StringBuilder();
        
int len = Math.min(24, hours.length);
        
for (int i = 0; i < len; i++{
            sb.append(hours[i] 
< 0 ? tHours[i] : hours[i]).append(',');
        }

        sb.deleteCharAt(sb.length() 
- 1);
        
this.value = sb.toString();
    }


    
public HourDataPK getPk() {
        
return pk;
    }


    
public void setPk(HourDataPK pk) {
        
this.pk = pk;
    }

}

posted on 2009-02-25 14:10 大卫 阅读(2997) 评论(2)  编辑  收藏 所属分类: Java

FeedBack:
# re: hibernate(jpa)复合主键annotation声明方法 2009-02-26 10:07 Mr.wang
学习  回复  更多评论
  
# re: hibernate(jpa)复合主键annotation声明方法 2009-03-03 13:19 相似
有够烂  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: