22 Jun 22:38
Re: JPA question
Meredith Gregory <lgreg.meredith <at> gmail.com>
2009-06-22 20:38:34 GMT
2009-06-22 20:38:34 GMT
Kris,
Thanks for the suggestion. i've now got a tiny little example that compiles on its own that illustrates the problem. Changing the inheritance strategy to JOINED makes no difference. Hibernate still does the wrong thing.
Best wishes,
--greg
On Mon, Jun 22, 2009 at 8:55 AM, Kris Nuttycombe <kris.nuttycombe <at> gmail.com> wrote:
This may be off the mark, but I'm wondering if the reason that you're
having difficulty with the parallel inheritance hierarchy problem is
not your use of TABLE_PER_CLASS inheritance. In my application, I have
a similar construct, but I am using JOINED_TABLE inheritance. This
allows for a normal foreign key relationship to be created in the
database between C2_table and the base table for CThing, with the
result that Hibernate will generate the query for CThing member as a
union. Using table per class inheritance, I would expect Hibernate to
need to synthesize an additional dtype field in C2_table along with
the key column in order to enforce the uniqueness of the keys to the
joined entities, and I don't believe that it does this.
I'm not sure how the fact that the code is generated is particularly
relevant; surely if it's possible to hand-write a successful solution,
then your code generator could be made aware of how to construct a
viable solution?
Kris
On Fri, Jun 19, 2009 at 8:47 PM, Meredith
Gregory<lgreg.meredith <at> gmail.com> wrote:
> All,
>
> i had a similar problem and found the source of the issues. Spse you have a
> container hierarchy (CTop <- C2) side-by-side with a contained hierarchy
> (CThing <- CThing1). The inheritance at the top of the container hierarchy,
> CTop, causes hibernate to bail on tracking the relations and punt to
> embedded values instead. Rewriting the top to be a <at> MappedSuperClass fixes
> the problem in this specific case. However, if your hierarchy is deep,
> you're screwed.
>
> If anybody has a suggestion for a workaround, i'm all ears. The problem is
> that it would appear that both Mr Crowley and i are generating Java + JPA
> code. So, the solution needs to be algorithmic and not 1-off.
>
> Perhaps the best solution is to find an alternative to hibernate as this is
> a particularly irritating bug.
>
> Best wishes,
>
> --greg
>
> <at> Entity
> <at> Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
> abstract class CTop {
> ...
> <at> Id
> <at> GeneratedValue(generator = "system-uuid")
> <at> GenericGenerator(name = "system-uuid", strategy = "uuid")
> private String id_CTop;
> }
>
> <at> Entity
> <at> Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
> abstract class CThing {
> ...
> <at> Id
> <at> GeneratedValue(generator = "system-uuid")
> <at> GenericGenerator(name = "system-uuid", strategy = "uuid")
> private String id_CThing;
> }
>
> <at> Entity
> <at> Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
> <at> Table(name = "C2_table", catalog = "mydb_production", uniqueConstraints = {
> <at> UniqueConstraint(columnNames = "uuid") })
> class C2 extends CTop {
> CThing thing;
> ...
> <at> OneToOne
> <at> JoinColumn
> public CThing getThing() {
> return this.thing;
> }
> public void setThing( CThing thing ) {
> this.thing = thing;
> }
>
> <at> Column(name = "uuid", unique = false, nullable = true, insertable = true,
> updatable = true)
> public String getUuid() {
> return this.uuid;
> }
>
> public void setUuid(String uuid) {
> this.uuid = uuid;
> }
>
> <at> Id
> <at> GeneratedValue(generator = "system-uuid")
> <at> GenericGenerator(name = "system-uuid", strategy = "uuid")
> <at> Column(name = "id", unique = false, nullable = true, insertable = true,
> updatable = true)
> public String getId() {
> return this.id;
> }
>
> }
>
> <at> Entity
> <at> Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
> <at> Table(name = "CThing1_table", catalog = "mydb_production",
> uniqueConstraints = { <at> UniqueConstraint(columnNames = "uuid") })
> class CThing1 extends CThing {
> ...
> // lots of ground type fields
>
> <at> Column(name = "uuid", unique = false, nullable = true, insertable = true,
> updatable = true)
> public String getUuid() {
> return this.uuid;
> }
>
> public void setUuid(String uuid) {
> this.uuid = uuid;
> }
>
> <at> Id
> <at> GeneratedValue(generator = "system-uuid")
> <at> GenericGenerator(name = "system-uuid", strategy = "uuid")
> <at> Column(name = "id", unique = false, nullable = true, insertable = true,
> updatable = true)
> public String getId() {
> return this.id;
> }
>
> }
>
>
> On Tue, Jun 16, 2009 at 1:45 PM, Derek Chen-Becker <java <at> chen-becker.org>
> wrote:
>>
>> John Nilsson wrote:
>> > Hi,
>> >
>> > I think the showSql property has been deprecated in favor of log4j
>> > loggers.
>> >
>> > If you set the log4j level to TRACE for org.hibernate you'll get
>> > everything Hibernate has to say about what it is doing. Can't remember
>> > which one it is, but I know one of the loggers will give you the
>> > values used in queries at the TRACE level.
>>
>> Good to know. Thanks!
>>
>
>
>
> --
> L.G. Meredith
> Managing Partner
> Biosimilarity LLC
> 1219 NW 83rd St
> Seattle, WA 98117
>
> +1 206.650.3740
>
> http://biosimilarity.blogspot.com
>
--
L.G. Meredith
Managing Partner
Biosimilarity LLC
1219 NW 83rd St
Seattle, WA 98117
+1 206.650.3740
http://biosimilarity.blogspot.com
RSS Feed