play framework 2.0.4,Java:复合主键声明和赋值

时间:2014-03-11 11:02:55

标签: java jpa playframework playframework-2.0 ebean

使用Ebean作为ORM,我有以下Model类:

@Entity
@Table(name = "update_proposition")
public class UpdateProposition extends Model {

    @EmbeddedId
    public UpdatePropositionKey id;
    public String               fieldName;
    public String               oldValue;
    public String               newValue;

    @Embeddable
    public class UpdatePropositionKey implements Serializable {

        @ManyToOne
        @JoinColumn(name = "update_request")
        public UpdateRequest updateRequest;
        public Date          date;
        @Id
        public int           serial;

        @Override
        public int hashCode() {
            return super.hashCode();
        }

        @Override
        public boolean equals(final Object obj) {
            return super.equals(obj);
        }
    }
}

我的目标是通过外键,日期和自动递增的序列号映射具有主键复合的表。 对于该实例,此模型会抛出RuntimeException: Error reading annotations。我该如何实现我的用例?

一旦这个问题解决了,如何分配日期和外键? 像updateProposition.id.date = Calendar.getInstance().getTime()这样的模式是否可行?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我找到了解决这个问题的方法。您的错误是因为UpdatePropositionKey类中的@ManyToOne批注。我将此关系移至UpdateProposition类,只留下UpdateRequest.id。所以现在有两个从UpdateProposition类到UpdateRequest类的映射。一个是复合键,第二个是@ManyToOne关系。两个映射都使用相同的列。另外@JoinColumn注释将属性'可更新和'可插入'设置为false。在这些之后所有的changecode看起来如下:

@Entity
@Table(name = "update_proposition")
public class UpdateProposition extends Model {

    public UpdateProposition(int aSerial, Date aDate) {
        id = new UpdatePropositionKey();
        id.serial = aSerial;
        id.date = aDate;
    }

    @EmbeddedId
    private UpdatePropositionKey id;

    @ManyToOne
    @JoinColumn(name = "update_request_id", insertable = false, updatable = false)
    private UpdateRequest updateRequest;

    public String fieldName;
    public String oldValue;
    public String newValue;

    public void setUpdateRequest(UpdateRequest aUpdateRequest) {
        updateRequest = aUpdateRequest;
        id.updateRequest_id = aUpdateRequest.id;
    }

    public UpdateRequest getUpdateRequest() {
        return updateRequest;
    }
}

@Embeddable
public class UpdatePropositionKey implements Serializable {

    @Id
    public int serial;

    public Date date;

    public int updateRequest_id;

    @Override
    public int hashCode() {
        return super.hashCode();
    }

    @Override
    public boolean equals(final Object obj) {
        return super.equals(obj);
    }
}