次のコードは新しいレコードを確実に作成できません。私は何が起こっていることは、レコードが遅延した後、データベースに追加されていると思いEntityManager.merge()はテーブルレコードを作成しません
/***
* Contains a record of an ongoing transfer.
* @author anchapma
*
*/
@Entity
@Table(name = "TransferRecord")
public class TransferRecord implements Serializable
{
/**
* Generated static unique ID.
*/
private static final long serialVersionUID = -8131586518447878482L;
/***
* The id of the transfer.
*/
private String transferId;
/***
* The name of the user who ownes the transfer.
*/
private String username;
/***
* Has this transfer been cancelled?
*/
private boolean cancelled;
/***
* Constructor.
*/
public TransferRecord()
{
this.transferId = "";
this.username = "";
this.cancelled = false;
}
/***
* Gets the transfer ID.
*
* @return The transfer ID.
*/
@Id
@Column(name = "TransferID", unique = true, nullable = false, length = 50)
public String getTransferId()
{
return this.transferId;
}
/***
* Sets the transfer ID.
* @param transferId The new transfer ID.
*/
public void setTransferId(String transferId)
{
this.transferId = transferId;
}
/***
* Gets the username.
*
* @return The username.
*/
@Column(name = "UserName", nullable = false, length = 50)
public String getUserName()
{
return this.username;
}
/***
* Sets the username.
* @param username The new username.
*/
public void setUserName(String username)
{
this.username = username;
}
/***
* Gets whether or not the transfer has been cancelled.
*
* @return True if the transfer has been cancelled.
*/
@Column(name = "Cancelled", nullable = false, length = 50)
public boolean getCancelled()
{
return this.cancelled;
}
/***
* Sets whether or not the transfer has been cancelled.
* @param cancelled True if the transfer has been cancelled.
*/
public void setCancelled(boolean cancelled)
{
this.cancelled = cancelled;
}
}
:
TransferRecord transfer = new TransferRecord();
transfer.setTransferId(metaData.getTransferId());
transfer.setUserName(metaData.getUserId().getUserName());
transfer.setCancelled(false);
em.merge(transfer);
em.flush();
ここで転送レコードのコードです。私のコードは、TransferRecordレコードの有無をフラグとして使用します。したがって、データはすぐにテーブルに表示する必要があります。
私はおそらく私の前提になるでしょうか?もしそうなら、返す前にレコードを書き出すまで、em.flush()
コールを強制的に呼び出す方法がありますか?
あなたの声明の一部はかなり曖昧です。たとえば、「したがって、データはすぐにテーブルに表示する必要があります。」取引の観点からはほとんど意味をなさない。 'em.flush()'を実行すると、永続コンテキストがデータベースにフラッシュされます。異なるトランザクションにおけるこれらの変更の可視性は、トランザクション分離レベルの影響を受けます。したがって、あなたが望む行動を述べることは価値があるでしょう。また、 "em.flush()呼び出しが返す前にレコードを書き出すまで強制的に待機させる方法はありますか?"ブロッキングコールなので意味がありません。 –
どのような変換が使用されていますか?「TransferRecordレコードの有無」のチェックはどこのコードが実行されますか? – ddewaele
コードは別のBeanによって呼び出されるBeanで実行されます。呼び出し元のBeanはステートレスで、数秒間実行されます。 Beanの操作が終了するまで、データは他のデータベースユーザーに表示されません。 –