Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[eclipselink-users] Odd use case

Here's an odd use case that I thought might be food for thought for future releases (or maybe it's already handled).  Or it might be such an outlier that I should take my marbles and go home. :-)

I have a 30 year old schema that I'm mapping to JPA.

There is a particularly odd case where a Document, let's say, conceptually refers to many GLAccounts.  But in practical usage terms it only refers to one.

That is, structurally, in the database, a GLAccount has no knowledge of a Document (no foreign key, or implied foreign key, pointing back to it).  Similarly, there is no join table setting up a one-or-many-to-many relationship between these two entities.

What there is instead is in the Document table there are 4/5 of a foreign key back to the GLAccount table, whose primary key is defined of 5 components.

The 5th part of the foreign key is a Date that is supplied from outside.

In JPA terms, what I would like to be able to do is designate a @ManyToOne relationship, but allow the associated @JoinColumns machinery to take in that fifth component from something else (like a @Transient (not transient) property).

So, hypothetically, in Document:

@Transient
private Date effectiveDate;

@ManyToOne
@JoinColumns(
  @JoinColumn(name = "f1", referencedColumnName = "pk1"),
  @JoinColumn(name = "f2", referencedColumnName = "pk2"),
  @JoinColumn(name = "f3", referencedColumnName = "pk3"),
  @JoinColumn(name = "f4", referencedColumnName = "pk4")
)
@some.eclipselink.annotation.here.AdditionalJoinCriteria(field = "effectiveDate", referencedColumnName = "pk5")
private GLAccount account;

The idea here is that I set the @Transient effectiveDate property, and, since it is @Transient, it does not get mapped to a column.  But since it's not Java-language transient, it does get serialized, so it might be available at retrieval time.

With that there, I would hope that I could then simply say getGLAccount() and have the @ManyToOne relationship perform the SELECT query.

Any alternatives to handle this case are appreciated.  I obviously know that I can store the four pk components as JPA fields in Document, and then run a query myself; I was hoping for an ability to make this simpler and more transparent.

THanks,
Laird

Back to the top