Just to notice a DN-HSQL scale/precision potential problem for others working
with DN and also for Estatio (at least for tests using HSQL).
As a example, I have an Entity field declared as:
// {{ Impact (property)
private BigDecimal impact;
@MemberOrder(sequence = "1.2")
public BigDecimal getImpact() {
return this.impact;
}
public void setImpact(final BigDecimal impact) {
this.impact = impact;
}
// }}
DataNucleus creates, at least with HSQL, the table with the field type as
NUMERIC(19). So no decimal digits are admitted [1].
That implies that when a record is inserted, a log entry similar to this one
appears:
INSER INTO ENTITY(..., IMPACT, ....) VALUES (...., 0.5, ....)
But when that same record is retrieved, the log will show that a value of "0"
is returned, instead of 0.5.
The solution is to explicitly add the scale to the field like this:
// {{ Impact (property)
@Column(scale=2)
private BigDecimal impact;
@MemberOrder(sequence = "1.2")
public BigDecimal getImpact() {
return this.impact;
}
public void setImpact(final BigDecimal impact) {
this.impact = impact;
}
// }}
On Estatio BDD tests the tables have different number of decimal places, due to
precision of BigDecimal operations.
Sure most of you already know, but there is a good tutorial on BigDecimals on
[2].
Just by annotating with @Column(scale=xxx) and setting also the scale to the
result of a BigDecimal operation with setScale(scale, roundingMode) [3] has
been enough for our tests.
So hope this helps (and many thanks for sharing the project),
Oscar.
[1] http://hsqldb.org/doc/2.0/guide/sqlgeneral-chapt.html#sgc_numeric_types
[2]
http://www.opentaps.org/docs/index.php/How_to_Use_Java_BigDecimal:_A_Tutorial
[3]
http://www.tutorialspoint.com/java/math/bigdecimal_setscale_rm_roundingmode.htm