簡體   English   中英

JPA(休眠):在通用@MappedSuperclass中使用@EmbeddedId時出錯

[英]JPA (Hibernate): Error when using @EmbeddedId in generic @MappedSuperclass

我目前正在為舊數據庫定義JPA實體(很多組合鍵,還有單列鍵)。 我創建了以下實體超類:

@MappedSuperclass
public abstract class AbstractEntity<ID extends Serializable> {
    public abstract ID getId();
    public abstract void setId(ID id);
}

然后是組合鍵的超類(以及長主鍵的超類,此處未列出):

@MappedSuperclass
public abstract class AbstractEmbeddedIdEntity<ID extends Serializable> extends AbstractEntity<ID> {
    @EmbeddedId
    private ID id;

    public AbstractEmbeddedIdEntity() {
        id = newId();
    }

    @Override
    public ID getId() {
        return id;
    }

    @Override
    public void setId(ID id) {
        this.id = id;
    }

    protected abstract ID newId();
}

最后是這樣的具體實體:

@Entity
@Table(name = "firstEntity")
public class FirstEntity extends AbstractEmbeddedIdEntity<FirstEntityId> {

    public FirstEntity() {
    }

    @Embeddable
    public static class FirstEntityId implements Serializable {
        @Column(name = "firstId")
        private String firstId;

        public FirstEntityId() {
        }

        @Override
        public boolean equals(Object obj) {
            if (obj == this) {
                return true;
            }
            if (!(obj instanceof FirstEntityId)) {
                return false;
            }
            FirstEntityId other = (FirstEntityId) obj;
            return 
                    Objects.equals(firstId, other.firstId);
        }

        @Override
        public int hashCode() {
            return Objects.hash(firstId);
        }
    }

    @Override
    protected FirstEntityId newId() {
        return new FirstEntityId();
    }
}

現在的問題是,如果我有多個這樣的實體,並嘗試訪問一個實體的ID屬性(當前使用Spring Boot,例如findByIdFirstId(String firstId) ),則會引發異常:

java.lang.IllegalArgumentException: Unable to locate Attribute  with the the given name [firstId] on this ManagedType [unknown]

我已經調試了這一點,發現在休眠狀態下,元模型將我的所有實體都映射到相同的MappedSupperclass實例。 在應用程序啟動期間,將newId()返回的@EmbeddedId設置為MappedSupperclass,從而覆蓋前一個實體的ID。 因此,最后,所有實體都映射到相同的MappedSupperclass,但是MappedSupperclass僅具有最后一個實體的@EmbeddedId

在上面的示例中,訪問ID屬性失敗,因為最后一個實體的@EmbeddedId沒有名為“ firstId”的屬性(該屬性已被最后一個實體的ID屬性覆蓋)。

現在我想知道我的方法是否錯誤,是否缺少某些東西,或者這可能是休眠問題?

使用spring boot的完整示例可在github上獲得 使用mvn spring-boot:run

在我看來,這就像是休眠中的錯誤,因此我在休眠中的錯誤跟蹤器中創建了一個票證。 作為一種解決方法,我現在在concreate實體類而不是抽象超類中定義ID屬性(@EmbeddedId)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM