[
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