Я не вижу ничего плохого в вашем коде здесь. Как упомянул @Vinod, мы полагаемся на фреймворки, такие как Spring, для обработки утомительного кода котельной плиты. В конце концов, вы не хотите, чтобы подобный код существовал во всех возможных методах DAO, которые у вас есть. Они затрудняют чтение и отладку.
Одним из вариантов является использование AOP, когда вы применяете рекомендации AspectJ "вокруг" к вашему методу DAO для обработки транзакции. Если вы не чувствуете себя комфортно с AOP, то вы можете написать свою собственную обертку котельной плиты, если вы не используете каркасы, такие как Spring.
Вот пример, который я создал, который может дать вам представление: -
// think of this as an anonymous block of code you want to wrap with transaction
public abstract class CodeBlock {
public abstract void execute();
}
// wraps transaction around the CodeBlock
public class TransactionWrapper {
public boolean run(CodeBlock codeBlock) {
PersistentTransaction t = null;
boolean status = false;
try {
t = PersistentManager.instance().getSession().beginTransaction();
codeBlock.execute();
t.commit();
status = true;
}
catch (Exception e) {
e.printStackTrace();
try {
t.rollback();
}
catch (Exception ignored) {
}
}
finally {
// close session
}
return status;
}
}
Тогда ваш метод DAO будет выглядеть так: -
TransactionWrapper transactionWrapper = new TransactionWrapper();
public String createObject() {
boolean status = transactionWrapper.run(new CodeBlock() {
@Override
public void execute() {
Foods f = new Foods();
f.save();
}
});
return status ? "everything allright" : "there was an error";
}