2017-02-17 33 views
0

В моем клиентском серверном приложении я использую JavaFx в качестве клиента и Java-спящего режима в качестве сервера для подключения к db.Для каждого сохранения (обновления) hibernate envers создает изменения, измененные в таблице или нет.

Проблема

У меня есть одна кнопка сохранить, и за каждый клик по кнопке, Envers создает одну ревизию, нет ли каких-либо изменений в таблице значений. В основном он не проверяет старые данные на новые данные, просто создавая ревизии.

Вот мой боб код

@Entity 
@Audited 
@Table(name = "DOMAIN") 
public class Domain implements java.io.Serializable { 

private Long domainId; 
private String domainName; 
private String dataType; 
private Long valueSize; 
private Long valuePrecision; 
private Long valueScale; 
private String valueRangeLow; 
private String valueRangeHigh; 
private String description; 
private String comments; 
private Date effectiveStartDate; 
private Date effectiveEndDate; 
private String status; 

public Domain() { 
} 

public Domain(Long domainId, String domainName, String dataType, 
     Date effectiveStartDate, Date effectiveEndDate, String status) { 
    this.domainId = domainId; 
    this.domainName = domainName; 
    this.dataType = dataType; 
    this.effectiveStartDate = effectiveStartDate; 
    this.effectiveEndDate = effectiveEndDate; 
    this.status = status; 
} 

public Domain(Long domainId, String domainName, String dataType, 
     Long valueSize, Long valuePrecision, 
     Long valueScale, String valueRangeLow, String valueRangeHigh, 
     String description, String comments, Date effectiveStartDate, 
     Date effectiveEndDate, String status) { 
    this.domainId = domainId; 
    this.domainName = domainName; 
    this.dataType = dataType; 
    this.valueSize = valueSize; 
    this.valuePrecision = valuePrecision; 
    this.valueScale = valueScale; 
    this.valueRangeLow = valueRangeLow; 
    this.valueRangeHigh = valueRangeHigh; 
    this.description = description; 
    this.comments = comments; 
    this.effectiveStartDate = effectiveStartDate; 
    this.effectiveEndDate = effectiveEndDate; 
    this.status = status; 
} 

@Id 
@GeneratedValue(generator = "DOMAIN_SEQ") 
@SequenceGenerator(name="DOMAIN_SEQ", sequenceName="DOMAIN_SEQ",allocationSize=1) 
@Column(name = "DOMAIN_ID", unique = true, nullable = false, precision = 22, scale = 0) 
public Long getDomainId() { 
    return this.domainId; 
} 

public void setDomainId(Long domainId) { 
    this.domainId = domainId; 
} 

@Column(name = "DOMAIN_NAME", nullable = false, length = 50) 
public String getDomainName() { 
    return this.domainName; 
} 

public void setDomainName(String domainName) { 
    this.domainName = domainName; 
} 

@Column(name = "DATA_TYPE", nullable = false, length = 50) 
public String getDataType() { 
    return this.dataType; 
} 

public void setDataType(String dataType) { 
    this.dataType = dataType; 
} 

@Column(name = "VALUE_SIZE", precision = 22, scale = 0) 
public Long getValueSize() { 
    return this.valueSize; 
} 

public void setValueSize(Long valueSize) { 
    this.valueSize = valueSize; 
} 

@Column(name = "VALUE_PRECISION", precision = 22, scale = 0) 
public Long getValuePrecision() { 
    return this.valuePrecision; 
} 

public void setValuePrecision(Long valuePrecision) { 
    this.valuePrecision = valuePrecision; 
} 

@Column(name = "VALUE_SCALE", precision = 22, scale = 0) 
public Long getValueScale() { 
    return this.valueScale; 
} 

public void setValueScale(Long valueScale) { 
    this.valueScale = valueScale; 
} 

@Column(name = "VALUE_RANGE_LOW", length = 50) 
public String getValueRangeLow() { 
    return this.valueRangeLow; 
} 

public void setValueRangeLow(String valueRangeLow) { 
    this.valueRangeLow = valueRangeLow; 
} 

@Column(name = "VALUE_RANGE_HIGH", length = 50) 
public String getValueRangeHigh() { 
    return this.valueRangeHigh; 
} 

public void setValueRangeHigh(String valueRangeHigh) { 
    this.valueRangeHigh = valueRangeHigh; 
} 

@Column(name = "DESCRIPTION", length = 200) 
public String getDescription() { 
    return this.description; 
} 

public void setDescription(String description) { 
    this.description = description; 
} 

@Column(name = "COMMENTS") 
public String getComments() { 
    return this.comments; 
} 

public void setComments(String comments) { 
    this.comments = comments; 
} 

@Temporal(TemporalType.DATE) 
@Column(name = "EFFECTIVE_START_DATE", nullable = false, length = 7) 
public Date getEffectiveStartDate() { 
    return this.effectiveStartDate; 
} 

public void setEffectiveStartDate(Date effectiveStartDate) { 
    this.effectiveStartDate = effectiveStartDate; 
} 

@Temporal(TemporalType.DATE) 
@Column(name = "EFFECTIVE_END_DATE", nullable = false, length = 7) 
public Date getEffectiveEndDate() { 
    return this.effectiveEndDate; 
} 

public void setEffectiveEndDate(Date effectiveEndDate) { 
    this.effectiveEndDate = effectiveEndDate; 
} 

@Column(name = "STATUS", nullable = false, length = 50) 
public String getStatus() { 
    return this.status; 
} 

public void setStatus(String status) { 
    this.status = status; 
} 

Проблема только с серверным приложением клиента.

С обычной автономной программой она работает нормально.

Может ли кто-нибудь мне помочь? Я застрял в этой точке. У меня отсутствуют какие-либо банки или что-то еще? Если вам нужно уточнить вопрос, пожалуйста, сообщите мне.

SERVER SIDE КОД

public long saveDomainFromJson(String domainJsonData) throws Exception { 
    long domainId = 0; 
    try { 
     // here I am setting data to bean, getting from client side 
     Domain domain = getDomainFromJson(domainJsonData);   

     Session session = HibernateUtil.currentSession(); 
     Transaction tx = session.beginTransaction(); 

     domainId = session.saveOrUpdate(domain); 

     tx.commit(); 
     HibernateUtil.closeSession(); 

    } catch (Exception e) { 
     e.printStackTrace(); 
     throw e; 
    } 
    return domainId; 
} 

Json данных

 
{ 
    "DOMAIN_ID":36, 
    "DOMAIN_NAME":"Test_Type", 
    "DOMAIN_DATA_TYPE":"STRING", 
    "DOMAIN_EFF_START_DATE":"2016-11-08", 
    "DOMAIN_EFF_END_DATE":"2099-12-31", 
    "DOMAIN_STATUS":"Draft", 
    "DOMAIN_DESCRIPTION":"Object Type: Added for testing purpose" 
}  
+0

Являются ли значения даты заданными клиентом каждый раз, когда изменение производится случайно? – Naros

+0

Если вы могли бы включить свой серверный код, который манипулирует сущностью и обновляет состояние, это тоже поможет. – Naros

+0

Да, клиент может установить дату, и я устанавливаю ту же дату, что и предыдущий .. И, я включил здесь код на стороне сервера, вы можете посмотреть –

ответ

0

К сожалению, я не видел это в ближайшее время, но проблема заключается в ваш призыв к session#save. Из Javadocs для Sessionhere, вы увидите следующий отрывок:

сохранить() и сохраняются() результат в SQL INSERT, удалить() в SQL DELETE и обновление() или слияния() в SQL UPDATE. Изменения в постоянных экземплярах обнаруживаются во время очистки, а также приводятся SQL UPDATE. saveOrUpdate() и replicate() приводят либо к INSERT, либо к UPDATE.

Таким образом, вы в основном хотите использовать session#saveOrUpdate, чтобы получить семантику вставки и обновления в зависимости от состояния вашего объекта.

С session#save генерирует новую операцию INSERT, Envers всегда будет создавать новую версию для этого случая независимо.

+0

Спасибо за хорошее объяснение. Теперь я попытался с ** session # saveOrUpdate **, но все же envers создает новую ревизию для каждого щелчка, я просто обновляю данные, а не вставляя новые данные. –

+0

Когда вы говорите _updating_, данные фактически меняются с помощью кликов? – Naros

+0

У меня проблема, спасибо за ссылку на ваши документы ** Naros **. Итак, вместо ** session # saveOrUpdate **, мне пришлось использовать ** session # merge **. Теперь envers - это компиляция каждый раз, и если он находит изменения, а только создает ревизию, то теперь приложение отлично работает. Voillaaa –

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

  • Нет связанных вопросов^_^