Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [eclipselink-users] Filtering OneToMany and ManyToOne relationship mappings

Please explain exactly what your HarmTypeJoin annotation does. I am a bit confused by the fact that you say the attribute is updated with the OneToManyMapping, but not for the ManyToOne. Please give more of an explanation.

The easiest way to have information written to the database is to map it. You could, for instance, add a Basic Mapping for the column as well.

-Tom

On 11/06/2013 11:41 AM, Luciano Santos wrote:
Hi Tom,

Based on your suggestions i have created my own annotation to declare the
foreign key filter i need to apply to that case, so i have something like this:

ManyToOne(cascade=ALL)
@JoinColumn(name="CO_SEQ_NOTIFICATION", referencedColumnName="CO_NOTIFICATION",
insertable=false, updatable=false)
@HarmTypeJoin(value=LABORATORY_INFO)
private HarmParameter information;

@OneToMany(cascade=ALL)
@JoinColumn(name = "CO_NOTIFICATION")
@HarmTypeJoin(value=LABORATORY_EXAM)
private Set<HarmParameter> exams;


So this awkward brings either a collection or a single value, depending on the
criteria i add to the query based on the Customizer i applied.

My problem now, is how to force a ManyToOne relationship to update the
referencedColumnName on persist. Is there a way? Of course this is automatic for
the OneToMany mapping.

Thanks


2013/6/4 Tom Ware <tom.ware@xxxxxxxxxx <mailto:tom.ware@xxxxxxxxxx>>

    Comments inline:


    On 03/06/2013 7:33 PM, Luciano Santos wrote:

        Hello Tom.

        Thanks for the response. I got how it works. Perfect flexibility to be
        able to
        express the additional criterion as JPA-QL or SQL Expressions.


    Please feel free to enter an enhancement request for this item and vote for
    it.  With enough votes we would consider implementing more direct JPA
    configuration for this feature.



        I'll create a base DescriptionCustomizer implementation and reuse it for the
        occurrences. Although i am thinking a good way to spread this into code,
        because
        i have about 45 occurences of scalar references to UserRole (Not really
        UserRole, was just an example), and other 50 to Sets of UserRole. So i am
        thinking of creating a custom annotation such as
        @UserRoleFilter(holeType="__STANDARD") and add into mapping.

        Will i be able to access the declaring Column from the DescriptionCustomizer
        somehow so i can grab the annotation data?


    It is not clear to me what you mean when you say declaring column but...

    A DescriptorCustomizer has access to a ClassDescriptor which has all the
    information about how a particular Entity is mapped, including, not only,
    all the information about all the mappings, but also information about the
    table it is mapped too, caching etc...  If the information is used by JPA it
    is there. If you can explain more precisely what you are looking for, I can
    give you a pointer.




        If you think it's a good approach, would i be too pretentious about
        creating a
        processor for this custom annotation so we don't need to create a bunch of
        DescriptorCustomizer extensions and have to declare them individually on the
        classes containing UserRole relationship occurences?


    The challenge here is getting the DescriptorCustomizer applied before the
    persistence unit is initialized.  In a non-Java-EE environment that should
    be fairly easy to manage because you have control over when the
    PersistenceUnit is accessed.  In Java EE, it will be more of a challenge
    since the container will typically initialize the persistence units as they
    are deployed.

    -Tom


        Thanks

        Luciano G Santos



        2013/6/3 Tom Ware <tom.ware@xxxxxxxxxx <mailto:tom.ware@xxxxxxxxxx>
        <mailto:tom.ware@xxxxxxxxxx <mailto:tom.ware@xxxxxxxxxx>>>


             Hi Luciano,

                Filtering relationships in EclipseLink requires the use of our
        native
             API. The way you do it is to create a DescriptorCustomizer

        http://www.eclipse.org/____eclipselink/documentation/2.4/____jpa/extensions/a_customizer.____htm#CHDCCDGC
        <http://www.eclipse.org/__eclipselink/documentation/2.4/__jpa/extensions/a_customizer.__htm#CHDCCDGC>


        <http://www.eclipse.org/__eclipselink/documentation/2.4/__jpa/extensions/a_customizer.__htm#CHDCCDGC
        <http://www.eclipse.org/eclipselink/documentation/2.4/jpa/extensions/a_customizer.htm#CHDCCDGC>>

                In the DescriptorCustomizer, you will have to access the mapping
        you want
             to change.  Then you will have to alter the selection criteria for the
             mapping. Here is some rough code from our test framework:

                OneToOneMapping oneToOneMapping =

        (OneToOneMapping)descriptor.____getMappingForAttributeName("____computer");
                Expression exp = oneToOneMapping.____buildSelectionCriteria();

                ExpressionBuilder builder = exp.getBuilder();
                Expression addedExpression =
             builder.getField("MAP_HRW.EMP_____LNAME").equal("Louis");

          oneToOneMapping.____setSelectionCriteria(exp.and(____addedExpression));


                Hopefully that will get you started.  If you have problems, we
        can help
             you on this list.

             -Tom


             On 03/06/2013 11:49 AM, Luciano Santos wrote:

                 Hello.

                 I am about to change our project's JPA implementation from
        Hibernate to
                 EclipseLink.
                 There is a tough relationship i am struggling to accomplish.

                 The case is similar as this (as much it might seems to make no
        much sense):

                 @Entity @Table(name="tb_role")
                 class Role {
                     @Id
                     private Long id;

                     @Enumerated(STRING)
                     private ProductType productType; // STANDARD, SPECIAL
                     ...
                 }

                 @Entity @Table(name="rl_user_role")
                 class UserRole {
                       ...
                      @ManyToOne
                      private Role role;

                      private String comments;
                      ...
                 }

                 @Entity @Table(name="tb_user")
                 class User {
                        @Id
                        private Long id;

                        @ManyToOne
                        // NEED to filter for SPECIAL (property or column value
        on Role)
                        // DO NOT HAVE A LOCAL FK column, should use USER_ID on
        rl_user_role
                        private UserRole claimForOthersRole;

                        @OneToMany
                        // NEED to filter for STANDARD (property or column value
        on Role)
                        @JoinColumn(name = "user_id")

                        private Set<UserRole> roles;

                 }


                 Do you guys have any clue on how could i accomplish this? I was
        trying
                 to use
                 Hibernate's @Where annotation, but i could just filter using
        columns on
                 "rl_user_role" (Couldn't be nested).

                 Thank you

                 Luciano Santos


                 ___________________________________________________
                 eclipselink-users mailing list
        eclipselink-users@xxxxxxxxxxx <mailto:eclipselink-users@xxxxxxxxxxx>
        <mailto:eclipselink-users@__eclipse.org
        <mailto:eclipselink-users@xxxxxxxxxxx>>
        https://dev.eclipse.org/____mailman/listinfo/eclipselink-____users
        <https://dev.eclipse.org/__mailman/listinfo/eclipselink-__users>
                 <https://dev.eclipse.org/__mailman/listinfo/eclipselink-__users
        <https://dev.eclipse.org/mailman/listinfo/eclipselink-users>>

             ___________________________________________________
             eclipselink-users mailing list
        eclipselink-users@xxxxxxxxxxx <mailto:eclipselink-users@xxxxxxxxxxx>
        <mailto:eclipselink-users@__eclipse.org
        <mailto:eclipselink-users@xxxxxxxxxxx>>
        https://dev.eclipse.org/____mailman/listinfo/eclipselink-____users
        <https://dev.eclipse.org/__mailman/listinfo/eclipselink-__users>

             <https://dev.eclipse.org/__mailman/listinfo/eclipselink-__users
        <https://dev.eclipse.org/mailman/listinfo/eclipselink-users>>




        _________________________________________________
        eclipselink-users mailing list
        eclipselink-users@xxxxxxxxxxx <mailto:eclipselink-users@xxxxxxxxxxx>
        https://dev.eclipse.org/__mailman/listinfo/eclipselink-__users
        <https://dev.eclipse.org/mailman/listinfo/eclipselink-users>

    _________________________________________________
    eclipselink-users mailing list
    eclipselink-users@xxxxxxxxxxx <mailto:eclipselink-users@xxxxxxxxxxx>
    https://dev.eclipse.org/__mailman/listinfo/eclipselink-__users
    <https://dev.eclipse.org/mailman/listinfo/eclipselink-users>




_______________________________________________
eclipselink-users mailing list
eclipselink-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/eclipselink-users



Back to the top