使用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()这样的模式可以正常工作吗?

谢谢你的帮助。

最佳答案

我找到了解决此问题的方法。您的错误是由于UpdatePropositionKey类中的@ManyToOne注释。我将此关系移到UpdateProposition类,仅留下UpdateRequest.id。因此,现在有两个从UpdateProposition类到UpdateRequest类的映射。第一个是通过组合键,第二个是通过@ManyToOne关系。两个映射使用同一列。另外,@ JoinColumn批注将属性“可更新的”和“可插入的”设置为false。这些更改之后,代码如下所示:

@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);
    }
}

关于java - Play Framework 2.0.4,Java:复合主键声明和赋值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22323783/

10-10 18:11