3

EJBとJPAを使用してデータベースレコードを更新する際に問題が発生しました。永続性プロバイダー:org.eclipse.persistence.jpa.PersistenceProvider

レコードを作成するときは、次の方法を使用しています。

public void create(T entity) {
    getEntityManager().persist(entity);
}

大丈夫。同じレコードを編集したいと思います。たとえば、私はエンティティを持っています:

@Entity
@Table(name = "OPERATION")
public class Operation implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID")
    private Long id;

    @Column(name = "OPERATION_AUTHOR")
    private String operationAuthor;

    @Column(name = "OPERATION_TYPE")
    private String operationType;

    @Column(name = "OPERATION_STATUS")
    private String operationStatus;

    @Column(name = "CREATED")
    @Temporal(value = TemporalType.DATE)
    private Date created;

    @Column(name = "COMPLETED")
    @Temporal(value = TemporalType.DATE)
    private Date completed;  

    //Getters and setters
}

たとえば、更新したいのはoperationStatus。同じレコードIDとnewを設定して、エンティティを作成していますoperationStatus。更新のために私はこの方法を使用しています:

public void edit(T entity) {
    getEntityManager().merge(entity);
}

問題は、レコードを更新するとステータスが正しく更新されますが、他のすべての列の値nullが以前のように残されないように設定されていることです。更新のみoperationStatusを行い、他の値は変更しません。これはEJBを使用してこれを行うことは可能ですか?そして、これを実現するために何を変更する必要がありますか?

4

2 に答える 2

5

Operation op = getEntityManager()。find(Operation.class、id)を使用して、最初にエンティティをロードします。次に、op.setOperationStatus(value)を実行します。これで、セッションのフラッシュ/クローズ時に更新されます。

于 2012-06-10T21:31:51.717 に答える
2

問題は、entityManager.merge(entity)を呼び出すと、db行(オブジェクトに設定したIDに対応)がJavaオブジェクトに入力されるのとまったく同じ値で更新されることです(つまり、statusとidを除くすべてがnullです)。データベースからオブジェクトを取り出してから更新する必要があります。

このためのより良いオプションは、次の方法です。

/**
 * 
 * @param id - the ID of the entity to update
 * @param operationStatus - the status to apply
 */
public void setOperationStatus(long id, String operationStatus){
    Operation o = getEntityManager().find(Operation.class,id);
    o.setOperationStatus(operationStatus);
    getEntityManager().merge(entity);
}
于 2012-06-10T21:41:37.923 に答える