У меня небольшая проблема с состоянием гонки.
public class MyClass1 {
static ThreadLocal<MyInterface> threads = new ThreadLocal();
static MyInterface getThread(){
return threads.get();
}
static String saveId(String name){
return getThread.saveId());
}
}
public interface MyInterface {
String saveId(String name);
}
public class MyClass2 implements MyInterface {
MyDao dao;
public String saveId(String name){
Session s= dao.getCurrentSession();
String id = (String)s.save(new MyObject(name));
return id;
}
}
И моя проблема, как лучше выбрать исключение состояния гонки, когда я пытаюсь сохранить Объект в БД, когда я использую singleton и hibernate?
Я думаю, что это правильное решение
private volatile String id;
public synchronized String saveId(String name){
Session s= dao.getCurrentSession();
id = (String)s.save(new MyObject(name));
return id;
}
Я не прав?
PS Мое второе предположение о коде:
public String saveId(String name){
Session s= dao.getCurrentSession();
String id = s.createQuery("select id from MyObject where name= :name order by id desc").setParameter("name", name).uniqueResult();
if (!StringUtils.isEmpty(id)) {
id = makeId(name);
}
return id;
}
public String makeId(String name) {
String id = s.createQuery("select id from MyObject where name= :name order by id desc").setParameter("name", name).uniqueResult();
if (!StringUtils.isEmpty(id)) {
synchronized (MyClass2.class){
id = (String)s.save(new MyObject(name));
s.flush();
}
}
return id;
}