2013-11-18 4 views
0

У меня возникла странная проблема в спящем режиме. Работа в многопоточном env при попытке вставить в одну из таблиц получение дубликатов записей в таблице. Только первичный ключ отличается, остальные остальные поля становятся точно повторяющимися.Повторяющиеся записи в Hibernate

Использование Hibernate + Oracle и использование Spring-HibernateTemplate объекта.

Вот часть моего моего BO-класса и ниже данного кода, чтобы сохранить объект. Не использовать какие-либо переходные поля.

Были отмечены другие посты, связанные с этим, но ни одна из них не касается основной причины проблемы. Я не хочу вводить какие-либо ограничения/уникальные индексы в таблице db.

@Entity 
@Table(name="ADIRECIPIENTINTERACTION") 
@Lazy(value = true) 
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) 
@GenericGenerator(name="recipientInteractionSeq", strategy = "native", parameters = 
{ @Parameter(name="sequence", value="SEQiRecipientInteractId")}) 
public class RecipientInteractionBO extends BusinessObject{ 
    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(generator = "recipientInteractionSeq", strategy = GenerationType.AUTO) 
    @Column(name="IRECIPIENTINTERACTIONID")  
    private long lId; .... 

И вот код, используемый для спасения БО.

----------------------------------------------------- 
RecipientInteractionBO recInt = (RecipientInteractionBO) objectPS 
        .getUniqueResult(detachedCriteria); 
if (recInt == null) { 
recInt = new RecipientInteractionBO(); 
.... 
hibernateTemplateObj.insertObject(recInt); 
} else { 
    ... 
    hibernateTemplateObj.saveOrUpdate(recInt); 
} 

Пожалуйста, дайте мне знать, если требуются какие-либо другие детали.

+0

Проблема, с которой вы сталкиваетесь, видна только в многопоточной среде? – Shailendra

+0

Да, это только в многопоточном env. – Hemanshu

ответ

1

Проверьте код сохранения данных для возможных условий гонки для нескольких потоков. Вы проверяете наличие RecipientInteractionBO, который, возможно, запрашивает базу данных. Если два потока выполняются одновременно, оба проверяют его существование, так как для обоих он не существует и для сохранения нового объекта. Возможно, вам понадобится синхронизация, чтобы процесс проверки и вставки/обновления выполнялся только для одного потока за один раз.

+0

Этот BO непосредственно соответствует Пользователю, и нет сценария, когда один и тот же пользователь может поступать из двух разных потоков. Таким образом, это не может быть проблемой. – Hemanshu

+0

Я хотел сказать, что, скажем, есть два потока t1 и t2. Первый поток t1 проверяет существование в базе данных. Он не находит, поэтому он продолжает сохранять новый, но прежде чем он сможет зафиксировать свои изменения, поток t2 также проверяет и видит, что данные не существуют, а также создает новый, поэтому сохраняются две сущности. – Shailendra

+0

Да, именно так это не относится к нашему коду. Ни один из двух потоков не имеет отношения к одному пользователю. – Hemanshu

Смежные вопросы