[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
Re: [eclipselink-users] Filtering OneToMany and ManyToOne relationship mappings
|
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>>
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>
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>
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