簡體   English   中英

JPA - 使用可插入/可更新

[英]JPA - Using insertable/updatable

我正在編寫一個Web服務來維護數據庫。 我正在嘗試將JPA(EclipseLink)用於實體類。 但是,數據庫使用自然主鍵,因此由於外鍵約束,ID字段的更新可能會失敗。 我們的DBA提供了一個更新ID字段的功能,這些ID字段將創建具有更新ID的新父記錄,更新子記錄以指向新父記錄並刪除舊父記錄。

如果ID字段可以“正常”更新,我會遇到這樣的情況:

@Entity
@Table(name = "PARENT")
public class Parent implements Serializable
{
    private static final long serialVersionUID = 1L;
    private String parent;
    private String attribute;
    private Set<Child> childs;

    public Parent()
    {
    }

    @Id
    @Column(name = "PARENT")
    public String getParent()
    {
        return this.parent;
    }

    public void setParent(String parent)
    {
        this.parent = parent;
    }

    @Column(name = "ATTRIBUTE")
    public String getAttribute()
    {
        return this.attribute;
    }

    public void setAttribute(String attribute)
    {
        this.attribute = attribute;
    }

    @OneToMany(mappedBy = "parentBean")
    public Set<Child> getChilds()
    {
        return this.childs;
    }

    public void setChilds(Set<Child> childs)
    {
        this.childs = childs;
    }
}

@Entity
@Table(name = "CHILD")
public class Child implements Serializable
{
    private static final long serialVersionUID = 1L;
    private String child;
    private String attribute;
    private Parent parentBean;

    public Child()
    {
    }

    @Id
    @Column(name = "CHILD")
    public String getChild()
    {
        return this.child;
    }

    public void setChild(String child)
    {
        this.child = child;
    }

    @Column(name = "ATTRIBUTE")
    public String getAttribute()
    {
        return this.attribute;
    }

    public void setAttribute(String attribute)
    {
        this.attribute = attribute;
    }

    @ManyToOne
    @JoinColumn(name = "PARENT")
    public Parent getParent()
    {
        return this.parent;
    }

    public void setParent(Parent parent)
    {
        this.parent = parent;
    }
}

我還有一個GenericServiceBean類,它帶有一個調用函數的方法:

@Stateless
public class GenericServiceBean implements GenericService
{
    @PersistenceContext(unitName = "PersistenceUnit")
    EntityManager em;

    public GenericServiceBean()
    {
        // empty
    }

    @Override
    public <T> T create(T t)
    {
        em.persist(t);
        return t;
    }

    @Override
    public <T> void delete(T t)
    {
        t = em.merge(t);
        em.remove(t);
    }

    @Override
    public <T> T update(T t)
    {
        return em.merge(t);
    }

    @Override
    public <T> T find(Class<T> type, Object id)
    {
        return em.find(type, id);
    }

    . . . 

    @Override
    public String executeStoredFunctionWithNamedArguments(String functionName,
            LinkedHashMap<String, String> namedArguments)
    {
        Session session = JpaHelper.getEntityManager(em).getServerSession();

        StoredFunctionCall functionCall = new StoredFunctionCall();
        functionCall.setProcedureName(functionName);        
        functionCall.setResult("RESULT", String.class);

        for (String key : namedArguments.keySet())
        {
            functionCall.addNamedArgumentValue(key, namedArguments.get(key));
        }

        ValueReadQuery query = new ValueReadQuery();
        query.setCall(functionCall);

        String status = (String)session.executeQuery(query);

        return status;
    }
}

如果我將ID字段設置為不可編輯:

    @Id
    @Column(name = "PARENT", udpatable=false)
    public String getParent()
    {
        return this.parent;
    }

並調用parent.setParent(newParent)這還會更新實體對象中的ID嗎? 這對任何子實體有何影響? 它們是否也會更新(或不更新)?

我不知道如何處理的另一個場景是我需要更新ID和另一個屬性。 我是否應該調用更新(並提交)數據庫中的ID的函數,然后通過普通的set *方法調用設置ID和屬性,然后持久化上下文只提交屬性更改?

也許這是JPA不合適的情況?

對此有任何建議非常感謝。

如果我將ID字段設置為不可編輯(...)並調用parent.setParent(newParent)這還會更新實體對象中的ID嗎? 這對任何子實體有何影響? 它們是否也會更新(或不更新)?

updatable=false表示無論您在對象級別執行什么操作,該列都不會成為SQL UPDATE語句的一部分,因此不應更新Id 而且我也很想說兒童實體不應該受到影響,特別是因為你沒有級聯任何東西。

我不知道如何處理的另一個場景是我需要更新ID和另一個屬性(...)

好吧,我的理解是你無論如何都要調用這個函數,所以我先調用它。

也許這是JPA不合適的情況?

我不確定原始SQL會更好地處理您的情況。 實際上,如果可能的話,改變主鍵的整個想法聽起來很奇怪。

暫無
暫無

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

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