Derek,

i completely concur. i wanted to give it a serious go, however, before i
abandoned it. The issue is that so much of the incumbent technology goes
across this object-relational boundary, i needed a simple case to justify
walking away from this technology. This example provides it. To see just how
non-complex it is, let me state it in common sense terms.

   1. Suppose we are building an app for a manufacturing firm, and the firm
   ships out its goods in different kinds of containers: plastic-coated
   cardboard boxes, metal boxes, etc.
   2. Suppose that different kinds of materials go into different kinds of
   boxes, and sometimes medicinal or toxic substances go into these containers;
   but, every container gets a manifest. When the container contains these
   materials that need to be handled with care or attention, the manifest is a
   special kind of certified manifest.

We might imagine that this firm has already constructed an object model that
looks like

abstract class Container { ...; Manifest getManifest(); void setManifest(
Manifest manifest ); ... }
class CardboardContainer extends Container { ... }
class MetalContainer extends Container { ... }
abstract class Manifest { ... }
class StdManifest extends Manifest { ... }
class CertifiedManifest extends Manifest { ... }

We need to work with their existing infrastructure. However, this
situation/model breaks Hibernate's implementation of JPA. That such a simple
situation would cause problems indicates to me that these technologies have
never been used in any significant way in production -- otherwise they would
have bumped into such a common case. If i'm wrong about something, here, i'd
love to be disabused of my misunderstanding(s). Currently, i feel i have
enough justification to go to a different kind of solution, such as a
LINQ-based solution.

Best wishes,

--greg

On Mon, Jun 22, 2009 at 5:46 PM, Derek Chen-Becker <dchenbec...@gmail.com>wrote:

> For sufficiently complex relationships, JPA is not a good fit. Beyond a
> certain point it's usually simpler to roll your own. I think that this is
> somewhat of a failing of the model, but it's not a simple problem to solve
> in the generic case.
>
> Derek
>
>
> On Mon, Jun 22, 2009 at 6:45 PM, Derek Chen-Becker 
> <dchenbec...@gmail.com>wrote:
>
>> Ah, sorry, I lost track of the thread.
>>
>>
>> On Mon, Jun 22, 2009 at 4:55 PM, Meredith Gregory <
>> lgreg.mered...@gmail.com> wrote:
>>
>>> Derek,
>>>
>>> You are correct and i noted and reported this on Scala on Friday.
>>> However, if you have a chain of the form
>>>
>>> AbstractClass <- Class <-contains- AbstractClass <-Class <-contains- ...
>>>
>>> The @MappedSuperclass solution fails at level 2.
>>>
>>> Best wishes,
>>>
>>> --greg
>>>
>>>
>>> On Mon, Jun 22, 2009 at 3:52 PM, Derek Chen-Becker <
>>> dchenbec...@gmail.com> wrote:
>>>
>>>> Something I just want to throw out into the discussion: Since you're
>>>> using table-per-class, having a @Table annotation on AbstractContainer
>>>> doesn't do anything since abstract classes can't have instances. Tables are
>>>> only generated for abstract classes if you're using a JOINED inheritance
>>>> strategy. You might want to look at using the MappedSuperclass annotation
>>>> for the abstract base class instead. If I change the AbstractContainer def
>>>> to:
>>>>
>>>> @MappedSuperclass
>>>> public abstract class AbstractContainer implements java.io.Serializable
>>>> {
>>>>
>>>> and then modify MySampleFuContainer to:
>>>>
>>>> public class MySampleFuContainer extends AbstractContainer {
>>>>
>>>> then I seem to get the proper schema:
>>>>
>>>>     create table lingo_production.MySampleFuContainer_table (
>>>>         id varchar(255) not null,
>>>>         uuid varchar(255),
>>>>         mysamplingmumble__idSuper varchar(255),
>>>>         primary key (id),
>>>>         unique (uuid)
>>>>     );
>>>>
>>>>
>>>> Having said that, I think that the behavior you're currently seeing
>>>> appears to be a bug.
>>>>
>>>> Derek
>>>>
>>>>
>>>> On Mon, Jun 22, 2009 at 3:43 PM, Meredith Gregory <
>>>> lgreg.mered...@gmail.com> wrote:
>>>>
>>>>> Kris,
>>>>>
>>>>> Here<http://svn.biosimilarity.com/src/open/codesamples/trunk/hibernate/>is
>>>>>  a link to the self-contained example that now uses just Java. i included
>>>>> the target dir in the repo to speed up investigation, but you can just 
>>>>> blow
>>>>> that away and build from scratch. The example is currently written to
>>>>> Java1.6, but also exhibits the same behavior under Java1.5. To run the
>>>>> example
>>>>>
>>>>> > svn co
>>>>> http://svn.biosimilarity.com/src/open/codesamples/trunk/hibernate
>>>>> ...
>>>>> > env PATH=<path-to-java1.6>:$PATH JAVA_HOME=<path-to-java1.6> mvn
>>>>> clean compile process-classes
>>>>>
>>>>> If you switch comment and decl at line 22 in
>>>>> src/main/java/maxb/hbex2/MySampleFuContainer.java then you see the error.
>>>>> The schema goes from
>>>>>
>>>>> create table lingo_production.MySampleFuContainer_table (
>>>>>         id_AbstractContainer varchar(255) not null,
>>>>>         varchar(255) not null,
>>>>>         uuid varchar(255),
>>>>>         mysamplingmumble__idSuper varchar(255),
>>>>>         primary key (id),
>>>>>         unique (uuid)
>>>>>     );
>>>>>
>>>>> to
>>>>>
>>>>> create table lingo_production.MySampleFuContainer_table (
>>>>>         id_AbstractContainer varchar(255) not null,
>>>>>         id varchar(255),
>>>>>         mysamplingmumble_ tinyblob,
>>>>>         uuid varchar(255),
>>>>>         primary key (id_AbstractContainer),
>>>>>         unique (id_AbstractContainer)
>>>>>     );
>>>>>
>>>>> Best wishes,
>>>>>
>>>>> --greg
>>>>>
>>>>>
>>>>> On Mon, Jun 22, 2009 at 1:38 PM, Meredith Gregory <
>>>>> lgreg.mered...@gmail.com> wrote:
>>>>>
>>>>>> 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.nuttyco...@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.mered...@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
>>>>>>> @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
>>>>>>> >
>>>>>>> > @Entity
>>>>>>> > @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
>>>>>>> > abstract class CTop {
>>>>>>> >    ...
>>>>>>> >    @Id
>>>>>>> >     @GeneratedValue(generator = "system-uuid")
>>>>>>> >     @GenericGenerator(name = "system-uuid", strategy = "uuid")
>>>>>>> >     private String id_CTop;
>>>>>>> > }
>>>>>>> >
>>>>>>> > @Entity
>>>>>>> > @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
>>>>>>> > abstract class CThing {
>>>>>>> >    ...
>>>>>>> >    @Id
>>>>>>> >     @GeneratedValue(generator = "system-uuid")
>>>>>>> >     @GenericGenerator(name = "system-uuid", strategy = "uuid")
>>>>>>> >     private String id_CThing;
>>>>>>> > }
>>>>>>> >
>>>>>>> > @Entity
>>>>>>> > @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
>>>>>>> > @Table(name = "C2_table", catalog = "mydb_production",
>>>>>>> uniqueConstraints = {
>>>>>>> > @UniqueConstraint(columnNames = "uuid") })
>>>>>>> > class C2 extends CTop {
>>>>>>> >    CThing thing;
>>>>>>> > ...
>>>>>>> >   @OneToOne
>>>>>>> >     @JoinColumn
>>>>>>> >     public CThing getThing() {
>>>>>>> >         return this.thing;
>>>>>>> >     }
>>>>>>> >     public void setThing( CThing thing ) {
>>>>>>> >         this.thing = thing;
>>>>>>> >     }
>>>>>>> >
>>>>>>> > @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;
>>>>>>> >     }
>>>>>>> >
>>>>>>> >     @Id
>>>>>>> >     @GeneratedValue(generator = "system-uuid")
>>>>>>> >     @GenericGenerator(name = "system-uuid", strategy = "uuid")
>>>>>>> >     @Column(name = "id", unique = false, nullable = true,
>>>>>>> insertable = true,
>>>>>>> > updatable = true)
>>>>>>> >     public String getId() {
>>>>>>> >         return this.id;
>>>>>>> >     }
>>>>>>> >
>>>>>>> > }
>>>>>>> >
>>>>>>> > @Entity
>>>>>>> > @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
>>>>>>> > @Table(name = "CThing1_table", catalog = "mydb_production",
>>>>>>> > uniqueConstraints = { @UniqueConstraint(columnNames = "uuid") })
>>>>>>> > class CThing1 extends CThing {
>>>>>>> > ...
>>>>>>> >   // lots of ground type fields
>>>>>>> >
>>>>>>> > @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;
>>>>>>> >     }
>>>>>>> >
>>>>>>> >     @Id
>>>>>>> >     @GeneratedValue(generator = "system-uuid")
>>>>>>> >     @GenericGenerator(name = "system-uuid", strategy = "uuid")
>>>>>>> >     @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 <
>>>>>>> j...@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
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> 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
>>>
>>>
>>>
>>
>
> >
>


-- 
L.G. Meredith
Managing Partner
Biosimilarity LLC
1219 NW 83rd St
Seattle, WA 98117

+1 206.650.3740

http://biosimilarity.blogspot.com

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Lift" group.
To post to this group, send email to liftweb@googlegroups.com
To unsubscribe from this group, send email to 
liftweb+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/liftweb?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to