プロジェクトでビジネスと持続性を分離しようとして困っています。スケルトンは多かれ少なかれ次のようなことを行います:
private UsuarioBO findById(String idUsuario) {
Usuario dao = getUsuarioDao().findById(idUsuario);
return new UsuarioBO(dao);
}
private void save(UsuarioBO bo){
Usuario dao = bo.bo2dao();
getUsuarioDao().save(dao);
}
上記のコードに関するいくつかの説明:
- UsuarioBO はビジネス オブジェクトであり、Usuario は DB テーブルにマップされたエンティティです。
new UsuarioBO(dao)
は単なるマッピング メソッドであり、これ もbo.bo2dao()
マッピング メソッドですが、新しい空のエンティティ Usuario が作成されます。- ご覧のとおり、両方のメソッドで作成されたエンティティは、メソッドの終了時にメモリが消去されます。
これをやろうとすると問題が発生します:
UsuarioBO example = findById("whatever");
save(example);
これを行うと、休止状態は「同じ識別子を持つ既存のエンティティがある」と教えてくれますが、それは本当です! (エンティティを上に作成しfindById()
、別のエンティティを上に作成していますsave()
)。
私が見つけた唯一の解決策は、エンティティを「bo」として使用することです。つまり、エンティティ オブジェクトをサービスに持ってきて、エンティティに直接変更を加え、完了したら、BO にもかかわらずエンティティを送信して保存します。
もっと良い方法があると確信していますが、どうすればいいですか?
編集:
これはsave(dao)
方法です:
public void save(Usuario usuario) throws Exception {
try {
getSession().saveOrUpdate(usuario);
} catch (RuntimeException e) {
//error treatment
throw e;
}
}
これはbo2dao()
メソッドです(BO Bean内にあります):
public Usuario bo2dao() throws Exception {
Usuario dao = new Usuario();
try {
dao.setId(this.id);
dao.setPassword(this.password);
//other similar fields...
dao.setLastLoginTime(this.lastLoginTime);
Role r = new Role();
r.setId(LoginHelper.getRoleId(this.role.getName()));
dao.setRole(r);
Status s = new Status();
s.setId(LoginHelper.getStatusId(this.status.getName()));
dao.setStatus(s);
} catch (Exception e) {
throw e;
}
return dao;
}
この場合、Role
とStatus
は接続されたエンティティ Bean でもありますUsuario
(1 人のユーザーは 1 つのロールと 1 つのステータスのみを持つことができます)。
getRoleId()
getStatusId()
名前から対応する ID を返します (例: "UNLOCKED"
return 1
)