使用JPA和Oracle管理具有增量ID的复合主键

时间:2012-10-25 09:14:27

标签: java oracle jpa sequence composite-key

使用JPA,我尝试修改多语言内容的持久化对象,这意味着我需要一个带有id和语言的复合键。 id也需要使用序列递增(我使用Oracle)。怎么办呢?

目前,我得到了Contenu课程:

@Entity
@Table(name = "CONTENUS")
public class Contenus implements java.io.Serializable {

    private ContenusId id;
    ...
}

和ContenusId类:

@Embeddable
public class ContenusId implements java.io.Serializable {

    private Long id;
    private String langue;
    ...
}

但是这并没有处理增量ID。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

首先,您需要JPA实体管理器的create和ID类来了解如何检查两个对象是否相等。此ID类应覆盖equals()hashcode()方法。

/**
 * ContenusPK.java
 * 
 * $Source$
 */
import java.io.Serializable;

public class ContenusPK implements Serializable
{
    public static final long serialVersionUID = 1L;

    private Long id;
    private String langue;

    /*
     * (non-Javadoc)
     * @see java.lang.Object#hashCode()
     */
    @Override
    public int hashCode()
    {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((id == null) ? 0 : id.hashCode());
        result = prime * result + ((langue == null) ? 0 : langue.hashCode());
        return result;
    }

    /*
     * (non-Javadoc)
     * @see java.lang.Object#equals(java.lang.Object)
     */
    @Override
    public boolean equals(Object obj)
    {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        ContenusPK other = (ContenusPK) obj;
        if (id == null)
        {
            if (other.id != null)
                return false;
        }
        else if (!id.equals(other.id))
            return false;
        if (langue == null)
        {
            if (other.langue != null)
                return false;
        }
        else if (!langue.equals(other.langue))
            return false;
        return true;
    }

    /**
     * @return the serialversionuid
     */
    public static long getSerialversionuid()
    {
        return serialVersionUID;
    }

    /**
     * @return the id
     */
    public Long getId()
    {
        return id;
    }

    /**
     * @return the langue
     */
    public String getLangue()
    {
        return langue;
    }

    /**
     * @param id the id to set
     */
    protected void setId(Long id)
    {
        this.id = id;
    }

    /**
     * @param langue the langue to set
     */
    protected void setLangue(String langue)
    {
        this.langue = langue;
    }

}

然后,您需要声明实体的复合主键属性,将ID类与实体相关联并定义ID​​生成策略,如下所示:

@IdClass(ContenusPK.class)
@Entity
@TableName(name="")
public class Contenus {

    @Id
    @GeneratedValue(
        strategy = GenerationType.SEQUENCE, 
        generator = "GENERATOR_NAME")
    @SequenceGenerator(
        name = "GENERATOR_NAME", 
        sequenceName = "SEQUENCE NAME IN DB")
    @Column(name = "CONTENUS_ID")
    private Long id;

    @Id
    @Column(name = "LANGUE")
    private String langue;

    ...
}