Oops, forgot a member of the hierarchy, inline below:

On Tue, Jun 23, 2009 at 3:19 PM, Kris
Nuttycombe<kris.nuttyco...@gmail.com> wrote:
> I'm just so puzzled by this thread because I have the following entity
> hierarchy in my app:
>
> @Entity
> @Inheritance(strategy = InheritanceType.JOINED)
> @Table(name = "payment_source_transaction")
> public abstract class PaymentSourceTransaction<T extends PaymentSource<T>>
>        extends SubscriptionTransaction implements
> MonetaryTransaction<T>, Serializable {
>
>   �...@manytoone(cascade = {CascadeType.MERGE, CascadeType.PERSIST},
> optional = false, targetEntity = PaymentSource.class)
>    private T paymentSource;
>
>    ...
> }
>
> @Entity
> public abstract class CreditCardTransaction extends
> PaymentSourceTransaction<CreditCard> { ... }
>

@MappedSuperclass
public abstract class VoidableCCTransaction extends
CreditCardTransaction implements Serializable { ... }

    @OneToOne(cascade = {CascadeType.MERGE, CascadeType.PERSIST},
mappedBy="voidedTransaction")
    private CCVoidTransaction voidTransaction;

> @Entity
> public class CCAuthTransaction extends VoidableCCTransaction
> implements AuthTransaction<CreditCard>, Divisional, Serializable { ..
> }
>
> @Entity
> @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
> public abstract class CCCaptureTransaction extends
> VoidableCCTransaction implements Serializable,
> CaptureTransaction<CreditCard> {
>    private static final long serialVersionUID = 1L;
>
>   �...@onetoone(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
>    private CCAuthTransaction authTransaction;
>
>    ...
> }
>
> @Entity
> public class EcometryCaptureTransaction extends CCCaptureTransaction
> implements EcometryOrder, Serializable { ... }
>
> @Entity
> @Inheritance(strategy = InheritanceType.JOINED)
> public abstract class PaymentSource<T extends PaymentSource<T>>
> extends UUEntity implements MutationControlled<T>, Serializable { ...
> }
>
> @Entity
> public class CreditCard extends PaymentSource<CreditCard> implements
> Addressable, Serializable { ... }
>
> @Entity
> public class CheckingAccount extends PaymentSource<CheckingAccount>
> implements Serializable { ... }
>
> This works for me without difficulty. What am I missing that is
> different about this scheme than the one that you describe?
>
> Kris
>
>
>
> On Tue, Jun 23, 2009 at 11:29 AM, Meredith
> Gregory<lgreg.mered...@gmail.com> wrote:
>> 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.
>>
>> 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.
>> 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 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