Grokbase Groups Cayenne user May 2015
FAQ
Hi all.

I have a weird case (using Cayenne 4.0-M2) where if I add a prefetch to a relationship, the relationship is nullified (will contain nothing). Consider the following code:

SelectQuery<ProductLink> q = SelectQuery.query( ProductLink.class );
q.addPrefetch( ProductLink.PRODUCT_KEY ); // <---- This line is the culprit

List<ProductLink> links = oc().select( q );

for( ProductLink link : links ) {
  System.out.println( link.product() );
}

Without the prefetch, the “product” relationship is properly populated for each “ProductLink” object, but if I include the prefetch, the relationship is always null.

Any ideas?

Cheers,
- hugi

Search Discussions

  • Andrus Adamchik at May 13, 2015 at 8:36 am
    Can you post the generated SQL by any chance? Also is there anything special about the relationship, or is it a simple to-one ?

    Andrus
    On May 12, 2015, at 6:02 PM, Hugi Thordarson wrote:

    Hi all.

    I have a weird case (using Cayenne 4.0-M2) where if I add a prefetch to a relationship, the relationship is nullified (will contain nothing). Consider the following code:

    SelectQuery<ProductLink> q = SelectQuery.query( ProductLink.class );
    q.addPrefetch( ProductLink.PRODUCT_KEY ); // <---- This line is the culprit

    List<ProductLink> links = oc().select( q );

    for( ProductLink link : links ) {
    System.out.println( link.product() );
    }

    Without the prefetch, the “product” relationship is properly populated for each “ProductLink” object, but if I include the prefetch, the relationship is always null.

    Any ideas?

    Cheers,
    - hugi
  • Hugi Thordarson at May 13, 2015 at 8:50 am
    Also is there anything special about the relationship, or is it a simple to-one ?
    Whoops, sorry. Yes — it’s just a simple one-to-one based on an integer column.

    - hugi
  • Hugi Thordarson at May 13, 2015 at 8:50 am
    Hi Andrus.
    Sure, here it is. Looks like a fetch is never performed for the “products” relationship…

    https://gist.github.com/hugith/6d0ccde4aa8877e26454

    Thanks!
    - hugi

    // Hugi Thordarson
    // http://www.loftfar.is/ <http://www.loftfar.is/>
    // s. 895-6688


    On 13. maí 2015, at 08:36, Andrus Adamchik wrote:

    Can you post the generated SQL by any chance? Also is there anything special about the relationship, or is it a simple to-one ?

    Andrus
    On May 12, 2015, at 6:02 PM, Hugi Thordarson wrote:

    Hi all.

    I have a weird case (using Cayenne 4.0-M2) where if I add a prefetch to a relationship, the relationship is nullified (will contain nothing). Consider the following code:

    SelectQuery<ProductLink> q = SelectQuery.query( ProductLink.class );
    q.addPrefetch( ProductLink.PRODUCT_KEY ); // <---- This line is the culprit

    List<ProductLink> links = oc().select( q );

    for( ProductLink link : links ) {
    System.out.println( link.product() );
    }

    Without the prefetch, the “product” relationship is properly populated for each “ProductLink” object, but if I include the prefetch, the relationship is always null.

    Any ideas?

    Cheers,
    - hugi
  • Hugi Thordarson at May 13, 2015 at 8:53 am

    Hi Andrus.
    Sure, here it is. Looks like a fetch is never performed for the “products” relationship…

    https://gist.github.com/hugith/6d0ccde4aa8877e26454 <https://gist.github.com/hugith/6d0ccde4aa8877e26454>

    *sigh* not enough coffee in me yet. Of course it performs a fetch :). The objects are not just present in the relationship. Sorry about spamming the list.

    Cheers,
    - hugi
  • Andrus Adamchik at May 13, 2015 at 9:01 am
    Actually it is performed. It is a "disjoint prefetch", so a second query is generated. I still don't see any clues as to why the prefetch is not working, so here is a purely random suggestion: you can try other prefetch strategies and see if that makes any difference. E.g.:

       query.addPrefetch( ProductLink.PRODUCT_KEY ).setSemantics(PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS);

    or

       query.addPrefetch( ProductLink.PRODUCT_KEY ).setSemantics(PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS);

    (BTW, looks like you are not using 4.0 cgen templates that would generate Property objects for each property?)

    Andrus
    On May 13, 2015, at 11:48 AM, Hugi Thordarson wrote:

    Hi Andrus.
    Sure, here it is. Looks like a fetch is never performed for the “products” relationship…

    https://gist.github.com/hugith/6d0ccde4aa8877e26454

    Thanks!
    - hugi

    // Hugi Thordarson
    // http://www.loftfar.is/ <http://www.loftfar.is/>
    // s. 895-6688


    On 13. maí 2015, at 08:36, Andrus Adamchik wrote:

    Can you post the generated SQL by any chance? Also is there anything special about the relationship, or is it a simple to-one ?

    Andrus
    On May 12, 2015, at 6:02 PM, Hugi Thordarson wrote:

    Hi all.

    I have a weird case (using Cayenne 4.0-M2) where if I add a prefetch to a relationship, the relationship is nullified (will contain nothing). Consider the following code:

    SelectQuery<ProductLink> q = SelectQuery.query( ProductLink.class );
    q.addPrefetch( ProductLink.PRODUCT_KEY ); // <---- This line is the culprit

    List<ProductLink> links = oc().select( q );

    for( ProductLink link : links ) {
    System.out.println( link.product() );
    }

    Without the prefetch, the “product” relationship is properly populated for each “ProductLink” object, but if I include the prefetch, the relationship is always null.

    Any ideas?

    Cheers,
    - hugi
  • Hugi Thordarson at May 13, 2015 at 9:29 am
    Thanks Andrus. Setting the semantics to PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS made the relationship resolve properly (and modified the SQL to use a join rather than a separate fetch for fetching the products). Looks like a bug, shouldn’t I report this?

    And I’m generating properties in my template—I’m just using slightly modified templates for easier conversion of my old EOF code.

    Cheers,
    - hugi

    // Hugi Thordarson
    // http://www.loftfar.is/ <http://www.loftfar.is/>
    // s. 895-6688


    On 13. maí 2015, at 09:00, Andrus Adamchik wrote:

    Actually it is performed. It is a "disjoint prefetch", so a second query is generated. I still don't see any clues as to why the prefetch is not working, so here is a purely random suggestion: you can try other prefetch strategies and see if that makes any difference. E.g.:

    query.addPrefetch( ProductLink.PRODUCT_KEY ).setSemantics(PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS);

    or

    query.addPrefetch( ProductLink.PRODUCT_KEY ).setSemantics(PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS);

    (BTW, looks like you are not using 4.0 cgen templates that would generate Property objects for each property?)

    Andrus
    On May 13, 2015, at 11:48 AM, Hugi Thordarson wrote:

    Hi Andrus.
    Sure, here it is. Looks like a fetch is never performed for the “products” relationship…

    https://gist.github.com/hugith/6d0ccde4aa8877e26454

    Thanks!
    - hugi

    // Hugi Thordarson
    // http://www.loftfar.is/ <http://www.loftfar.is/>
    // s. 895-6688


    On 13. maí 2015, at 08:36, Andrus Adamchik wrote:

    Can you post the generated SQL by any chance? Also is there anything special about the relationship, or is it a simple to-one ?

    Andrus
    On May 12, 2015, at 6:02 PM, Hugi Thordarson wrote:

    Hi all.

    I have a weird case (using Cayenne 4.0-M2) where if I add a prefetch to a relationship, the relationship is nullified (will contain nothing). Consider the following code:

    SelectQuery<ProductLink> q = SelectQuery.query( ProductLink.class );
    q.addPrefetch( ProductLink.PRODUCT_KEY ); // <---- This line is the culprit

    List<ProductLink> links = oc().select( q );

    for( ProductLink link : links ) {
    System.out.println( link.product() );
    }

    Without the prefetch, the “product” relationship is properly populated for each “ProductLink” object, but if I include the prefetch, the relationship is always null.

    Any ideas?

    Cheers,
    - hugi
  • Andrus Adamchik at May 13, 2015 at 9:35 am
    Yeah a bug report would be great. But we'll need more information to reproduce the problem. A disjoint prefetch on to-one is the most common case and it works of course, so there has to be something special about your DB or your mapping. A full DataMap (or at least the part with these 2 entities) should help. If you can't expose it publicly, you can still open a Jira, and email me the mapping privately.

    Thanks,
    Andrus
    On May 13, 2015, at 12:29 PM, Hugi Thordarson wrote:

    Thanks Andrus. Setting the semantics to PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS made the relationship resolve properly (and modified the SQL to use a join rather than a separate fetch for fetching the products). Looks like a bug, shouldn’t I report this?

    And I’m generating properties in my template—I’m just using slightly modified templates for easier conversion of my old EOF code.

    Cheers,
    - hugi

    // Hugi Thordarson
    // http://www.loftfar.is/ <http://www.loftfar.is/>
    // s. 895-6688


    On 13. maí 2015, at 09:00, Andrus Adamchik wrote:

    Actually it is performed. It is a "disjoint prefetch", so a second query is generated. I still don't see any clues as to why the prefetch is not working, so here is a purely random suggestion: you can try other prefetch strategies and see if that makes any difference. E.g.:

    query.addPrefetch( ProductLink.PRODUCT_KEY ).setSemantics(PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS);

    or

    query.addPrefetch( ProductLink.PRODUCT_KEY ).setSemantics(PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS);

    (BTW, looks like you are not using 4.0 cgen templates that would generate Property objects for each property?)

    Andrus
    On May 13, 2015, at 11:48 AM, Hugi Thordarson wrote:

    Hi Andrus.
    Sure, here it is. Looks like a fetch is never performed for the “products” relationship…

    https://gist.github.com/hugith/6d0ccde4aa8877e26454

    Thanks!
    - hugi

    // Hugi Thordarson
    // http://www.loftfar.is/ <http://www.loftfar.is/>
    // s. 895-6688


    On 13. maí 2015, at 08:36, Andrus Adamchik wrote:

    Can you post the generated SQL by any chance? Also is there anything special about the relationship, or is it a simple to-one ?

    Andrus
    On May 12, 2015, at 6:02 PM, Hugi Thordarson wrote:

    Hi all.

    I have a weird case (using Cayenne 4.0-M2) where if I add a prefetch to a relationship, the relationship is nullified (will contain nothing). Consider the following code:

    SelectQuery<ProductLink> q = SelectQuery.query( ProductLink.class );
    q.addPrefetch( ProductLink.PRODUCT_KEY ); // <---- This line is the culprit

    List<ProductLink> links = oc().select( q );

    for( ProductLink link : links ) {
    System.out.println( link.product() );
    }

    Without the prefetch, the “product” relationship is properly populated for each “ProductLink” object, but if I include the prefetch, the relationship is always null.

    Any ideas?

    Cheers,
    - hugi
  • Hugi Thordarson at May 13, 2015 at 3:27 pm
    Darn… Took a better look at the model, turns out the “product_link.product_id" field was a string, while “product.id” was an integer. Changing both fields to integers resolved the issue. As I said this morning; not enough coffee in me :).

    PErhaps adding validation for matching types in relationships might be helpful, even if it’d just emit a warning when the runtime is initialized (or in the Modeler)? These days, EOF refuses to start up an EOF stack if any modeled relationships have joins on different value types (unless a property is set to explicitly allow it). I’d love to write and contribute a check like that if you believe it would be useful.

    Cheers,
    - hugi


    On 13. maí 2015, at 09:34, Andrus Adamchik wrote:

    Yeah a bug report would be great. But we'll need more information to reproduce the problem. A disjoint prefetch on to-one is the most common case and it works of course, so there has to be something special about your DB or your mapping. A full DataMap (or at least the part with these 2 entities) should help. If you can't expose it publicly, you can still open a Jira, and email me the mapping privately.

    Thanks,
    Andrus
    On May 13, 2015, at 12:29 PM, Hugi Thordarson wrote:

    Thanks Andrus. Setting the semantics to PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS made the relationship resolve properly (and modified the SQL to use a join rather than a separate fetch for fetching the products). Looks like a bug, shouldn’t I report this?

    And I’m generating properties in my template—I’m just using slightly modified templates for easier conversion of my old EOF code.

    Cheers,
    - hugi

    // Hugi Thordarson
    // http://www.loftfar.is/ <http://www.loftfar.is/>
    // s. 895-6688


    On 13. maí 2015, at 09:00, Andrus Adamchik wrote:

    Actually it is performed. It is a "disjoint prefetch", so a second query is generated. I still don't see any clues as to why the prefetch is not working, so here is a purely random suggestion: you can try other prefetch strategies and see if that makes any difference. E.g.:

    query.addPrefetch( ProductLink.PRODUCT_KEY ).setSemantics(PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS);

    or

    query.addPrefetch( ProductLink.PRODUCT_KEY ).setSemantics(PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS);

    (BTW, looks like you are not using 4.0 cgen templates that would generate Property objects for each property?)

    Andrus
    On May 13, 2015, at 11:48 AM, Hugi Thordarson wrote:

    Hi Andrus.
    Sure, here it is. Looks like a fetch is never performed for the “products” relationship…

    https://gist.github.com/hugith/6d0ccde4aa8877e26454

    Thanks!
    - hugi

    // Hugi Thordarson
    // http://www.loftfar.is/ <http://www.loftfar.is/>
    // s. 895-6688


    On 13. maí 2015, at 08:36, Andrus Adamchik wrote:

    Can you post the generated SQL by any chance? Also is there anything special about the relationship, or is it a simple to-one ?

    Andrus
    On May 12, 2015, at 6:02 PM, Hugi Thordarson wrote:

    Hi all.

    I have a weird case (using Cayenne 4.0-M2) where if I add a prefetch to a relationship, the relationship is nullified (will contain nothing). Consider the following code:

    SelectQuery<ProductLink> q = SelectQuery.query( ProductLink.class );
    q.addPrefetch( ProductLink.PRODUCT_KEY ); // <---- This line is the culprit

    List<ProductLink> links = oc().select( q );

    for( ProductLink link : links ) {
    System.out.println( link.product() );
    }

    Without the prefetch, the “product” relationship is properly populated for each “ProductLink” object, but if I include the prefetch, the relationship is always null.

    Any ideas?

    Cheers,
    - hugi
  • John Huss at May 13, 2015 at 3:54 pm
    It would be useful. MySQL disallows foreign keys that link different data
    types and that has caused problems for me when converting an app from
    Postgres to MySQL. A check like you propose would have caught it earlier.
    On Wed, May 13, 2015 at 10:27 AM Hugi Thordarson wrote:

    Darn… Took a better look at the model, turns out the
    “product_link.product_id" field was a string, while “product.id” was an
    integer. Changing both fields to integers resolved the issue. As I said
    this morning; not enough coffee in me :).

    PErhaps adding validation for matching types in relationships might be
    helpful, even if it’d just emit a warning when the runtime is initialized
    (or in the Modeler)? These days, EOF refuses to start up an EOF stack if
    any modeled relationships have joins on different value types (unless a
    property is set to explicitly allow it). I’d love to write and contribute a
    check like that if you believe it would be useful.

    Cheers,
    - hugi


    On 13. maí 2015, at 09:34, Andrus Adamchik wrote:

    Yeah a bug report would be great. But we'll need more information to
    reproduce the problem. A disjoint prefetch on to-one is the most common
    case and it works of course, so there has to be something special about
    your DB or your mapping. A full DataMap (or at least the part with these 2
    entities) should help. If you can't expose it publicly, you can still open
    a Jira, and email me the mapping privately.
    Thanks,
    Andrus
    On May 13, 2015, at 12:29 PM, Hugi Thordarson wrote:

    Thanks Andrus. Setting the semantics to
    PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS made the relationship resolve
    properly (and modified the SQL to use a join rather than a separate fetch
    for fetching the products). Looks like a bug, shouldn’t I report this?
    And I’m generating properties in my template—I’m just using slightly
    modified templates for easier conversion of my old EOF code.
    Cheers,
    - hugi

    // Hugi Thordarson
    // http://www.loftfar.is/ <http://www.loftfar.is/>
    // s. 895-6688


    On 13. maí 2015, at 09:00, Andrus Adamchik wrote:

    Actually it is performed. It is a "disjoint prefetch", so a second
    query is generated. I still don't see any clues as to why the prefetch is
    not working, so here is a purely random suggestion: you can try other
    prefetch strategies and see if that makes any difference. E.g.:
    query.addPrefetch( ProductLink.PRODUCT_KEY
    ).setSemantics(PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS);
    or

    query.addPrefetch( ProductLink.PRODUCT_KEY
    ).setSemantics(PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS);
    (BTW, looks like you are not using 4.0 cgen templates that would
    generate Property objects for each property?)
    Andrus
    On May 13, 2015, at 11:48 AM, Hugi Thordarson wrote:

    Hi Andrus.
    Sure, here it is. Looks like a fetch is never performed for the
    “products” relationship…
    https://gist.github.com/hugith/6d0ccde4aa8877e26454

    Thanks!
    - hugi

    // Hugi Thordarson
    // http://www.loftfar.is/ <http://www.loftfar.is/>
    // s. 895-6688


    On 13. maí 2015, at 08:36, Andrus Adamchik wrote:

    Can you post the generated SQL by any chance? Also is there anything
    special about the relationship, or is it a simple to-one ?
    Andrus
    On May 12, 2015, at 6:02 PM, Hugi Thordarson wrote:

    Hi all.

    I have a weird case (using Cayenne 4.0-M2) where if I add a
    prefetch to a relationship, the relationship is nullified (will contain
    nothing). Consider the following code:
    SelectQuery<ProductLink> q = SelectQuery.query( ProductLink.class );
    q.addPrefetch( ProductLink.PRODUCT_KEY ); // <---- This line is the
    culprit
    List<ProductLink> links = oc().select( q );

    for( ProductLink link : links ) {
    System.out.println( link.product() );
    }

    Without the prefetch, the “product” relationship is properly
    populated for each “ProductLink” object, but if I include the prefetch, the
    relationship is always null.
    Any ideas?

    Cheers,
    - hugi
  • Michael Gentry at May 13, 2015 at 4:45 pm
    Hmm, I thought I had added a validation check for that last year as I was
    bitten by the same issue. Will have to revisit it.

    mrg

    On Wed, May 13, 2015 at 11:27 AM, Hugi Thordarson wrote:

    Darn… Took a better look at the model, turns out the
    “product_link.product_id" field was a string, while “product.id” was an
    integer. Changing both fields to integers resolved the issue. As I said
    this morning; not enough coffee in me :).

    PErhaps adding validation for matching types in relationships might be
    helpful, even if it’d just emit a warning when the runtime is initialized
    (or in the Modeler)? These days, EOF refuses to start up an EOF stack if
    any modeled relationships have joins on different value types (unless a
    property is set to explicitly allow it). I’d love to write and contribute a
    check like that if you believe it would be useful.

    Cheers,
    - hugi


    On 13. maí 2015, at 09:34, Andrus Adamchik wrote:

    Yeah a bug report would be great. But we'll need more information to
    reproduce the problem. A disjoint prefetch on to-one is the most common
    case and it works of course, so there has to be something special about
    your DB or your mapping. A full DataMap (or at least the part with these 2
    entities) should help. If you can't expose it publicly, you can still open
    a Jira, and email me the mapping privately.
    Thanks,
    Andrus
    On May 13, 2015, at 12:29 PM, Hugi Thordarson wrote:

    Thanks Andrus. Setting the semantics to
    PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS made the relationship resolve
    properly (and modified the SQL to use a join rather than a separate fetch
    for fetching the products). Looks like a bug, shouldn’t I report this?
    And I’m generating properties in my template—I’m just using slightly
    modified templates for easier conversion of my old EOF code.
    Cheers,
    - hugi

    // Hugi Thordarson
    // http://www.loftfar.is/ <http://www.loftfar.is/>
    // s. 895-6688


    On 13. maí 2015, at 09:00, Andrus Adamchik wrote:

    Actually it is performed. It is a "disjoint prefetch", so a second
    query is generated. I still don't see any clues as to why the prefetch is
    not working, so here is a purely random suggestion: you can try other
    prefetch strategies and see if that makes any difference. E.g.:
    query.addPrefetch( ProductLink.PRODUCT_KEY
    ).setSemantics(PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS);
    or

    query.addPrefetch( ProductLink.PRODUCT_KEY
    ).setSemantics(PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS);
    (BTW, looks like you are not using 4.0 cgen templates that would
    generate Property objects for each property?)
    Andrus
    On May 13, 2015, at 11:48 AM, Hugi Thordarson wrote:

    Hi Andrus.
    Sure, here it is. Looks like a fetch is never performed for the
    “products” relationship…
    https://gist.github.com/hugith/6d0ccde4aa8877e26454

    Thanks!
    - hugi

    // Hugi Thordarson
    // http://www.loftfar.is/ <http://www.loftfar.is/>
    // s. 895-6688


    On 13. maí 2015, at 08:36, Andrus Adamchik wrote:

    Can you post the generated SQL by any chance? Also is there anything
    special about the relationship, or is it a simple to-one ?
    Andrus
    On May 12, 2015, at 6:02 PM, Hugi Thordarson wrote:

    Hi all.

    I have a weird case (using Cayenne 4.0-M2) where if I add a
    prefetch to a relationship, the relationship is nullified (will contain
    nothing). Consider the following code:
    SelectQuery<ProductLink> q = SelectQuery.query( ProductLink.class );
    q.addPrefetch( ProductLink.PRODUCT_KEY ); // <---- This line is the
    culprit
    List<ProductLink> links = oc().select( q );

    for( ProductLink link : links ) {
    System.out.println( link.product() );
    }

    Without the prefetch, the “product” relationship is properly
    populated for each “ProductLink” object, but if I include the prefetch, the
    relationship is always null.
    Any ideas?

    Cheers,
    - hugi

Related Discussions

Discussion Navigation
viewthread | post
Discussion Overview
groupuser @
categoriescayenne
postedMay 12, '15 at 3:05p
activeMay 13, '15 at 4:45p
posts11
users4
websitecayenne.apache.org

People

Translate

site design / logo © 2021 Grokbase