[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
[eclipselink-dev] Question about EmbeddedAccessor#processEmbeddableClass()
|
Hi!
I've read through the eclipselink sources and like to add a few features.
Generally, I'd to say that it is a really well done and _very_ readable source! I did look at the sources for only 2 evenings now (and I really enjoyed digging into it), so don't be rude if I completely misinterpreted/not understood something yet :)
There's a point in the EmbeddedAccesor which I do not understand:
In the function processEmbeddableClass(), a 'cached' EmbeddedAccessor instance is retrieved (line # 299)
EmbeddableAccessor accessor = getProject().getEmbeddableAccessor(getReferenceClassName());
So I'll get the same EmbeddableAccessor instance for EVERY embedding of the same class.
A bit later in the source (line # 349), this EmbeddableAccessor will be filled with the OwningDescriptor:
accessor.setOwningDescriptor(getOwningDescriptor());
BUT: imho the owning descriptor may be different for each @Embedded !?
In praxis this means, that the EmbeddableAccessor always points to the Table-Descriptor of the 'first' occurence (which one this ever may be -> random generator?), and the other ones may simply contain wrong values.
My example:
@Embeddable
public class Price {
private BigDecimal amount;
private String currency;
}
@Entity
public class Purchase {
@Id
@GeneratedValue
private int id;
@Embedded(prefix = "N_")
private Price netPrice;
@Embedded(prefix = "G_")
private Price grossPrice;
}
@Entity
public class OtherUseOfPrice {
@Id
@GeneratedValue
private int id;
@Embedded(prefix = "O_")
private Price otherPrice;
}
In the debugger I got the following memory addresses:
O_ id=40 accessor=98 getowningDescriptor()= 45
N_ id=101 accessor=98 getowningDescriptor()= 102
G_ id=116 accessor=98 getowningDescriptor()= 102
And as expected, the accessor of the embeddings of netPrice (N_) and grossPrice (G_) point to the wrong m_owningDescriptor 45 instead of the correct 102
Does this have any impact on the result? If not, we also could remove the owningDescriptor from the EmbeddableAccessor, otherwise it may be a source of problems, isn't?