persistence@glassfish.java.net

Re: SV: Re: SV: Re: SV: Re: SV: RE: SV: _at_OneToMany problem

From: Craig L Russell <Craig.Russell_at_Sun.COM>
Date: Fri, 13 Jul 2007 13:54:52 -0700

Hi Kasper,

On Jul 12, 2007, at 11:02 PM, Kasper.Moller_at_tietoenator.com wrote:

> Hi Marina
>
> Thanks for your help ... any good reason that it can not be done
> automatically runtime?

No. As a user, you can ask that this feature be added to a future
revision of the JPA specification.

 From the JSR 220 title page, "Please send comments to: ejb3-spec-
feedback_at_sun.com "

Regards,

Craig
>
> / Kasper
>
> -----Oprindelig meddelelse-----
> Fra: Marina.Vatkina_at_Sun.COM [mailto:Marina.Vatkina_at_Sun.COM]
> Sendt: 12. juli 2007 18:57
> Til: persistence_at_glassfish.dev.java.net
> Emne: Re: SV: Re: SV: Re: SV: RE: SV: @OneToMany problem
>
> Hi Kasper,
>
> In JPA relationships are not managed by the provider. See e.g.
>
> 2.1.7 Entity Relationships
>
> Note that it is the application that bears responsibility for
> maintaining the
> consistency of runtime relationships-for example, for insuring that
> the "one"
> and the "many" sides of a bidirectional relationship are consistent
> with one
> another when the application updates the relationship at runtime.
>
> Regards,
> -marina
>
> Kasper.Moller_at_tietoenator.com wrote:
>> Hi Marina
>>
>> It surprises me very much that I have to set my reference two places.
>>
>> The data mapper layers I have written my self do this
>> automatically when I have a bidirectional relationship.
>>
>> But it does explain why it works when I restart Glassfish without
>> deleting and recreating test data. The relationship does exist in
>> the database.
>>
>> So what you mean is that I have to do like beneath ...
>>
>> MobilePhone mobilePhone1 = new MobilePhone(...);
>>
>> DistMob distMob = new DistMob(distributorFK, mobilePhone1,
>> DistMob.Status.UNBLOCKED);
>>
>> mobilePhone1.setDistMobs(newDistMobs)
>>
>> I just do not see why I have to do the last part ... I would
>> expect this to be handled automatically by the JPA.
>>
>> Anyone who can confirm or come with a link to the behaviour
>> described above? Can not find anything in the J2EE tutorials.
>>
>> Kind regards
>> Kasper
>>
>> -----Oprindelig meddelelse-----
>> Fra: Marina.Vatkina_at_Sun.COM [mailto:Marina.Vatkina_at_Sun.COM]
>> Sendt: 11. juli 2007 18:39
>> Til: persistence_at_glassfish.dev.java.net
>> Emne: Re: SV: Re: SV: RE: SV: @OneToMany problem
>>
>> Hi Kasper,
>>
>> For 'mobilePhone.getDistMobs()' to return the related instances,
>> there should be
>> a code that sets those references via 'mobilePhone.setDistMobs
>> (newDistMobs)'. I
>> can't find the latter in your code.
>>
>> thanks,
>> -marina
>>
>> Kasper.Moller_at_tietoenator.com wrote:
>>
>>> Hi Marina
>>>
>>> The relationship is set here:
>>>
>>>
>>>
>>>> DistMob distMob = new DistMob(distributorFK, mobilePhone1,
>>>> DistMob.Status.UNBLOCKED);
>>>>
>>>> em.persist(distMob);
>>>
>>>
>>> Mobile phones can be associated with many DistMobs (which is a
>>> many-many relationship between Distributors and Mobile phones)
>>>
>>> I will try it on Glassfish2 soon if there are not any who have
>>> triede this behaviour before ... it is very strange. Thought it
>>> maybe just was me doing something silly wrong.
>>>
>>> Kind regards
>>> / Kasper
>>>
>>> -----Oprindelig meddelelse-----
>>> Fra: Marina.Vatkina_at_Sun.COM [mailto:Marina.Vatkina_at_Sun.COM]
>>> Sendt: 11. juli 2007 00:14
>>> Til: persistence_at_glassfish.dev.java.net
>>> Emne: Re: SV: RE: SV: @OneToMany problem
>>>
>>> Hi Kasper,
>>>
>>> I don't see any relationships being set in your code when you
>>> create new
>>> instances. Or are they set (on both sides) somewhere else?
>>>
>>> thanks,
>>> -marina
>>>
>>> Kasper.Moller_at_tietoenator.com wrote:
>>>
>>>
>>>> Hi
>>>>
>>>>
>>>>
>>>> I have now found a pattern in this strange behaviour and it is
>>>> probably
>>>> wrong usage of the JPA.
>>>>
>>>>
>>>>
>>>> I have found out that I do not have to redeploy my ear file to
>>>> recreate
>>>> my problem. If I restart the server and executes the following
>>>> client
>>>> code ... everything works fine:
>>>>
>>>>
>>>>
>>>> private static void testOneToMany() {
>>>>
>>>> final AuServices auServices;
>>>>
>>>> try {
>>>>
>>>> final InitialContext ctx = new InitialContext();
>>>>
>>>> auServices = (AuServices)
>>>> ctx.lookup(AuServices.class.getName());
>>>>
>>>>
>>>>
>>>> // Test that IMEI number 356828001349104 is not blocked
>>>>
>>>> try {
>>>>
>>>> if (auServices.isBlocked("356828001349104")) {
>>>>
>>>> throw new RuntimeException();
>>>>
>>>> } else {
>>>>
>>>> System.out.println("isBlocked IMEI number
>>>> 356828001349104 is not blocked succed!");
>>>>
>>>> }
>>>>
>>>> } catch (NoPhoneException e) {
>>>>
>>>> throw new RuntimeException(e.getMessage(), e);
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>> } catch (NamingException e) {
>>>>
>>>> e.printStackTrace(); //To change body of catch statement
>>>> use File | Settings | File Templates.
>>>>
>>>> }
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> If I execute the following code ... the application breaks ...
>>>> but without
>>>> any errors in the log file.
>>>>
>>>>
>>>>
>>>> private static void testOneToMany() {
>>>>
>>>> final AuServices auServices;
>>>>
>>>> final AucoreTest aucoreTest;
>>>>
>>>> try {
>>>>
>>>> final InitialContext ctx = new InitialContext();
>>>>
>>>> auServices = (AuServices)
>>>> ctx.lookup(AuServices.class.getName());
>>>>
>>>> aucoreTest = (AucoreTest)
>>>> ctx.lookup(AucoreTest.class.getName());
>>>>
>>>>
>>>>
>>>> // First delete data
>>>>
>>>> aucoreTest.deleteTestData();
>>>>
>>>>
>>>>
>>>> // Create standard test data
>>>>
>>>> aucoreTest.createTestData();
>>>>
>>>>
>>>>
>>>> // Test that IMEI number 356828001349104 is not blocked
>>>>
>>>> try {
>>>>
>>>> if (auServices.isBlocked("356828001349104")) {
>>>>
>>>> throw new RuntimeException();
>>>>
>>>> } else {
>>>>
>>>> System.out.println("isBlocked IMEI number
>>>> 356828001349104 is not blocked succed!");
>>>>
>>>> }
>>>>
>>>> } catch (NoPhoneException e) {
>>>>
>>>> throw new RuntimeException(e.getMessage(), e);
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>> } catch (NamingException e) {
>>>>
>>>> e.printStackTrace(); //To change body of catch statement
>>>> use File | Settings | File Templates.
>>>>
>>>> }
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>> The only difference here is that I first delete my test data and
>>>> thereafter recreate it with two different methods on a stateless
>>>> session
>>>> bean.
>>>>
>>>> The code is shown below:
>>>>
>>>>
>>>>
>>>> public void createTestData() {
>>>>
>>>> // First create an address
>>>>
>>>> final Stairway stairway = new Stairway("101", "95", "XXX",
>>>> "27",
>>>> "E", "9999", "9999", Stairway.Status.LOCKED);
>>>>
>>>> em.persist(stairway);
>>>>
>>>>
>>>>
>>>> // Then create a door unit
>>>>
>>>> final DoorUnit doorUnit1 = new DoorUnit(stairway, "XXX",
>>>> "1230989648B8", "123BA0992A2B2CF51C17404F125B827D");
>>>>
>>>> em.persist(doorUnit1);
>>>>
>>>>
>>>>
>>>> final DoorUnit doorUnit2 = new DoorUnit(stairway, "XXX",
>>>> "1230989648A4", "123350F9EAAB2CF51C17404F125B827D");
>>>>
>>>> em.persist(doorUnit2);
>>>>
>>>>
>>>>
>>>> // Create a distributor
>>>>
>>>> final Distributor distributorFK = new Distributor("FK",
>>>> "XXXXXXX
>>>> a/s");
>>>>
>>>> em.persist(distributorFK);
>>>>
>>>>
>>>>
>>>> final Distributor distributorBK = new Distributor("BK",
>>>> "XXXXXXX
>>>> a/s");
>>>>
>>>> em.persist(distributorBK);
>>>>
>>>>
>>>>
>>>> // Create a Mobile phone
>>>>
>>>> final MobilePhone mobilePhone1 = new MobilePhone("+46",
>>>> "999999999", "356828001349104", MobilePhone.StatusIMEI.LOCKED,
>>>> MobilePhone.StatusBlocked.NONEWBLOCKED);
>>>>
>>>> em.persist(mobilePhone1);
>>>>
>>>>
>>>>
>>>> final MobilePhone mobilePhone2 = new MobilePhone("+46",
>>>> "999999999", "354007001514932", MobilePhone.StatusIMEI.LOCKED,
>>>> MobilePhone.StatusBlocked.NONEWBLOCKED);
>>>>
>>>> em.persist(mobilePhone2);
>>>>
>>>>
>>>>
>>>> final MobilePhone mobilePhoneFK = new MobilePhone("+45",
>>>> "99999999", null, MobilePhone.StatusIMEI.UNLOCKED,
>>>> MobilePhone.StatusBlocked.NONEWBLOCKED);
>>>>
>>>> em.persist(mobilePhoneFK);
>>>>
>>>>
>>>>
>>>> // DistMob relation
>>>>
>>>> DistMob distMob = new DistMob(distributorFK, mobilePhone1,
>>>> DistMob.Status.UNBLOCKED);
>>>>
>>>> em.persist(distMob);
>>>>
>>>>
>>>>
>>>> distMob = new DistMob(distributorBK, mobilePhone1,
>>>> DistMob.Status.UNBLOCKED);
>>>>
>>>> em.persist(distMob);
>>>>
>>>>
>>>>
>>>> distMob = new DistMob(distributorFK, mobilePhone2,
>>>> DistMob.Status.UNBLOCKED);
>>>>
>>>> em.persist(distMob);
>>>>
>>>>
>>>>
>>>> distMob = new DistMob(distributorBK, mobilePhone2,
>>>> DistMob.Status.UNBLOCKED);
>>>>
>>>> em.persist(distMob);
>>>>
>>>>
>>>>
>>>> // Finally the access entities
>>>>
>>>> // Valid
>>>>
>>>> Date startAccess;
>>>>
>>>> Date endAccess;
>>>>
>>>> try {
>>>>
>>>> startAccess = new
>>>> SimpleDateFormat("yyyyMMddHHmmss").parse("20070101000000");
>>>>
>>>> endAccess = new
>>>> SimpleDateFormat("yyyyMMddHHmmss").parse("20091231235959");
>>>>
>>>> } catch (ParseException e) {
>>>>
>>>> throw new RuntimeException(e.getMessage(), e);
>>>>
>>>> }
>>>>
>>>> Access access = new Access(doorUnit1, distributorFK,
>>>> mobilePhone1, startAccess, endAccess);
>>>>
>>>> em.persist(access);
>>>>
>>>>
>>>>
>>>> try {
>>>>
>>>> startAccess = new
>>>> SimpleDateFormat("yyyyMMddHHmmss").parse("20070101000000");
>>>>
>>>> endAccess = new
>>>> SimpleDateFormat("yyyyMMddHHmmss").parse("20091231235959");
>>>>
>>>> } catch (ParseException e) {
>>>>
>>>> throw new RuntimeException(e.getMessage(), e);
>>>>
>>>> }
>>>>
>>>> access = new Access(doorUnit2, distributorBK, mobilePhone1,
>>>> startAccess, endAccess);
>>>>
>>>> em.persist(access);
>>>>
>>>>
>>>>
>>>> try {
>>>>
>>>> startAccess = new
>>>> SimpleDateFormat("yyyyMMddHHmmss").parse("20070101000000");
>>>>
>>>> endAccess = new
>>>> SimpleDateFormat("yyyyMMddHHmmss").parse("20091231235959");
>>>>
>>>> } catch (ParseException e) {
>>>>
>>>> throw new RuntimeException(e.getMessage(), e);
>>>>
>>>> }
>>>>
>>>> access = new Access(doorUnit1, distributorBK, mobilePhone2,
>>>> startAccess, endAccess);
>>>>
>>>> em.persist(access);
>>>>
>>>>
>>>>
>>>> try {
>>>>
>>>> startAccess = new
>>>> SimpleDateFormat("yyyyMMddHHmmss").parse("20070101000000");
>>>>
>>>> endAccess = new
>>>> SimpleDateFormat("yyyyMMddHHmmss").parse("20091231235959");
>>>>
>>>> } catch (ParseException e) {
>>>>
>>>> throw new RuntimeException(e.getMessage(), e);
>>>>
>>>> }
>>>>
>>>> access = new Access(doorUnit2, distributorBK, mobilePhone2,
>>>> startAccess, endAccess);
>>>>
>>>> em.persist(access);
>>>>
>>>>
>>>>
>>>> // Expired
>>>>
>>>> try {
>>>>
>>>> startAccess = new
>>>> SimpleDateFormat("yyyyMMddHHmmss").parse("20070101000000");
>>>>
>>>> endAccess = new
>>>> SimpleDateFormat("yyyyMMddHHmmss").parse("20070627235959");
>>>>
>>>> } catch (ParseException e) {
>>>>
>>>> throw new RuntimeException(e.getMessage(), e);
>>>>
>>>> }
>>>>
>>>> access = new Access(doorUnit1, distributorFK, mobilePhone1,
>>>> startAccess, endAccess);
>>>>
>>>> em.persist(access);
>>>>
>>>>
>>>>
>>>> // Not yet valid
>>>>
>>>> try {
>>>>
>>>> startAccess = new
>>>> SimpleDateFormat("yyyyMMddHHmmss").parse("20080101000000");
>>>>
>>>> endAccess = new
>>>> SimpleDateFormat("yyyyMMddHHmmss").parse("20090627235959");
>>>>
>>>> } catch (ParseException e) {
>>>>
>>>> throw new RuntimeException(e.getMessage(), e);
>>>>
>>>> }
>>>>
>>>> access = new Access(doorUnit1, distributorFK, mobilePhone1,
>>>> startAccess, endAccess);
>>>>
>>>> em.persist(access);
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>> public void deleteTestData() {
>>>>
>>>> deleteDataFromTable("Entry");
>>>>
>>>> deleteDataFromTable("Access");
>>>>
>>>> deleteDataFromTable("DistMob");
>>>>
>>>> deleteDataFromTable("MobilePhone");
>>>>
>>>> deleteDataFromTable("Distributor");
>>>>
>>>> deleteDataFromTable("DoorUnit");
>>>>
>>>> deleteDataFromTable("Stairway");
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>> private void deleteDataFromTable(final String tableName) {
>>>>
>>>> final List objects = em.createQuery("SELECT t FROM " +
>>>> tableName
>>>> + " t").getResultList();
>>>>
>>>> for (Object object : objects) {
>>>>
>>>> em.remove(object);
>>>>
>>>> }
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>> I can not figure out why this deletion and recreation breaks the
>>>> server
>>>> .... But if I restart the server and removes the deletion and
>>>> recreation ...
>>>> everything works fine.
>>>>
>>>>
>>>>
>>>> What is it that I have misunderstood?
>>>>
>>>>
>>>>
>>>> / Kasper
>>>>
>>>> -------------------------------------------------------------------
>>>> -----
>>>>
>>>> *Fra:* Eve Pokua [mailto:gorgeous65_at_msn.com]
>>>> *Sendt:* 9. juli 2007 18:53
>>>> *Til:* persistence_at_glassfish.dev.java.net
>>>> *Emne:* RE: SV: @OneToMany problem
>>>>
>>>>
>>>>
>>>>
>>>> Could you also send some code of the client, it might be just a
>>>> little
>>>> mistake, if it is not error.
>>>>
>>>> eve
>>>>
>>>> -------------------------------------------------------------------
>>>> -----
>>>>
>>>> Date: Mon, 9 Jul 2007 12:01:51 +0200
>>>> From: Kasper.Moller_at_tietoenator.com
>>>> To: persistence_at_glassfish.dev.java.net
>>>> Subject: SV: @OneToMany problem
>>>>
>>>> Hello
>>>>
>>>>
>>>>
>>>> I have a problem using a @OneToMany relationship. I have to two
>>>> classes
>>>> (MobilePhone and DistMob) defined at the end: It is a bidirectional
>>>> relationship where DistMob can have one MobilePhone and
>>>> MobilePhone can
>>>> have many DistMobs.
>>>>
>>>>
>>>>
>>>> My application deploys without any problem on glassfish 1 stable
>>>> release. The problem first occurs at runtime. After first
>>>> deployment
>>>> everything works fine ... retrieving a MobilePhone with the
>>>> follwing code
>>>> executes normally and mobilePhone.getDistMobs() gives me the
>>>> correct
>>>> number of DistMobs being in the database.
>>>>
>>>>
>>>>
>>>> public boolean isBlocked(final String imeiNumber) throws
>>>> NoPhoneException {
>>>>
>>>> if (imeiNumber == null || "".equals(imeiNumber.trim())) {
>>>>
>>>> throw new IllegalArgumentException("Argument null or
>>>> empty!");
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>> final MobilePhone mobilePhone =
>>>> mobilePhoneFinder.findByImeiNumber(em, imeiNumber);
>>>>
>>>>
>>>>
>>>> boolean blocked = true;
>>>>
>>>> for (DistMob distMob : mobilePhone.getDistMobs()) {
>>>>
>>>> if (DistMob.Status.UNBLOCKED.equals(distMob.getStatus
>>>> ())) {
>>>>
>>>> blocked = false;
>>>>
>>>> break;
>>>>
>>>> }
>>>>
>>>> }
>>>>
>>>> return blocked;
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> My problem occurs when I redeploy my application ... at deploy
>>>> time there
>>>> is still no errors .... But at runtime will
>>>> mobilePhone.getDistMobs()
>>>> retrieve 0 elements. I am 100% sure that no one else is using my
>>>> database and that it is same code which is deploy. I can not
>>>> figure out
>>>> what the problem might be.
>>>>
>>>>
>>>>
>>>> The behaviour changes some times ... but I can not find a pattern.
>>>>
>>>>
>>>>
>>>> package com.tietoenator.bekey.aucore.persistence;
>>>>
>>>>
>>>>
>>>> import javax.persistence.*;
>>>>
>>>> import java.util.List;
>>>>
>>>>
>>>>
>>>> /**
>>>>
>>>> * User: mollekas
>>>>
>>>> * Date: 2007-06-26
>>>>
>>>> * Time: 14:34:59
>>>>
>>>> */
>>>>
>>>> @Entity
>>>>
>>>> public class MobilePhone {
>>>>
>>>> @Id
>>>>
>>>> @GeneratedValue(strategy = GenerationType.IDENTITY)
>>>>
>>>> private String id;
>>>>
>>>>
>>>>
>>>> private String prefix;
>>>>
>>>>
>>>>
>>>> public void setPrefix(final String prefix) {
>>>>
>>>> this.prefix = prefix;
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>> public String getPrefix() {
>>>>
>>>> return prefix;
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>> private String number;
>>>>
>>>> private String imeiNumber;
>>>>
>>>> private String statusImei;
>>>>
>>>> private String statusBlocked;
>>>>
>>>>
>>>>
>>>> @OneToMany(mappedBy = "mobilePhone")
>>>>
>>>> private List<DistMob> distMobs;
>>>>
>>>>
>>>>
>>>> @OneToMany(mappedBy = "mobilePhone")
>>>>
>>>> private List<Access> accesses;
>>>>
>>>>
>>>>
>>>> public List<Access> getAccesses() {
>>>>
>>>> return accesses;
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>> public List<DistMob> getDistMobs() {
>>>>
>>>> return distMobs;
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>> public void setNumber(final String number) {
>>>>
>>>> this.number = number;
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>> public void setImeiNumber(final String imeiNumber) {
>>>>
>>>> this.imeiNumber = imeiNumber;
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>> public void setStatusImei(final StatusIMEI statusImeiIMEI) {
>>>>
>>>> this.statusImei = statusImeiIMEI.getCode();
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>> public void setStatusBlocked(final StatusBlocked statusBlocked) {
>>>>
>>>> this.statusBlocked = statusBlocked.getCode();
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>> public String getNumber() {
>>>>
>>>> return number;
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>> public String getImeiNumber() {
>>>>
>>>> return imeiNumber;
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>> public StatusIMEI getStatusImei() {
>>>>
>>>> try {
>>>>
>>>> return StatusIMEI.getStatus(statusImei);
>>>>
>>>> } catch (IllegalStateException e) {
>>>>
>>>> throw new IllegalStateException("Status code unknown for
>>>> mobile phone with PK: " + id, e);
>>>>
>>>> }
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>> public StatusBlocked getStatusBlocked() {
>>>>
>>>> try {
>>>>
>>>> return StatusBlocked.getStatus(statusBlocked);
>>>>
>>>> } catch (IllegalStateException e) {
>>>>
>>>> throw new IllegalStateException("Status code unknown for
>>>> mobile phone with PK: " + id, e);
>>>>
>>>> }
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>> public MobilePhone(final String prefix, final String number,
>>>> final
>>>> String imeiNumber, final StatusIMEI statusIMEI, final StatusBlocked
>>>> statusBlocked) {
>>>>
>>>> this.prefix = prefix;
>>>>
>>>> this.number = number;
>>>>
>>>> this.imeiNumber = imeiNumber;
>>>>
>>>> this.statusImei = statusIMEI.getCode();
>>>>
>>>> this.statusBlocked = statusBlocked.getCode();
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>> public MobilePhone() {
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>> public static class StatusIMEI {
>>>>
>>>>
>>>>
>>>> /**
>>>>
>>>> * Blocked
>>>>
>>>> */
>>>>
>>>> public final static StatusIMEI LOCKED = new StatusIMEI
>>>> ("LOCKED");
>>>>
>>>>
>>>>
>>>> /**
>>>>
>>>> * Unblocked
>>>>
>>>> */
>>>>
>>>> public final static StatusIMEI UNLOCKED = new
>>>> StatusIMEI("UNLOCKED");
>>>>
>>>>
>>>>
>>>> private final String code;
>>>>
>>>>
>>>>
>>>> private StatusIMEI(final String code) {
>>>>
>>>> this.code = code;
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>> public String getCode() {
>>>>
>>>> return code;
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>> public static StatusIMEI getStatus(final String statusCode){
>>>>
>>>> if(LOCKED.getCode().equals(statusCode)){
>>>>
>>>> return LOCKED;
>>>>
>>>> }
>>>>
>>>> else if(UNLOCKED.getCode().equals(statusCode)){
>>>>
>>>> return UNLOCKED;
>>>>
>>>> }
>>>>
>>>> else{
>>>>
>>>> throw new IllegalStateException("Unknown staus code
>>>> detected. Code was: " + statusCode);
>>>>
>>>> }
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>> public boolean equals(final Object o) {
>>>>
>>>> if (this == o) return true;
>>>>
>>>> if (o == null || getClass() != o.getClass()) return
>>>> false;
>>>>
>>>>
>>>>
>>>> final StatusIMEI statusIMEI = (StatusIMEI) o;
>>>>
>>>>
>>>>
>>>> if (code != null ? !code.equals(statusIMEI.code) :
>>>> statusIMEI.code != null) return false;
>>>>
>>>>
>>>>
>>>> return true;
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>> public int hashCode() {
>>>>
>>>> return (code != null ? code.hashCode() : 0);
>>>>
>>>> }
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>> public static class StatusBlocked {
>>>>
>>>>
>>>>
>>>> /**
>>>>
>>>> * Blocked
>>>>
>>>> */
>>>>
>>>> public final static StatusBlocked NEWBLOCKED = new
>>>> StatusBlocked("NEWBLOCKED");
>>>>
>>>>
>>>>
>>>> /**
>>>>
>>>> * Unblocked
>>>>
>>>> */
>>>>
>>>> public final static StatusBlocked NONEWBLOCKED = new
>>>> StatusBlocked("NONEWBLOCKED");
>>>>
>>>>
>>>>
>>>> private final String code;
>>>>
>>>>
>>>>
>>>> private StatusBlocked(final String code) {
>>>>
>>>> this.code = code;
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>> public String getCode() {
>>>>
>>>> return code;
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>> public static StatusBlocked getStatus(final String
>>>> statusCode){
>>>>
>>>> if(NEWBLOCKED.getCode().equals(statusCode)){
>>>>
>>>> return NEWBLOCKED;
>>>>
>>>> }
>>>>
>>>> else if(NONEWBLOCKED.getCode().equals(statusCode)){
>>>>
>>>> return NONEWBLOCKED;
>>>>
>>>> }
>>>>
>>>> else{
>>>>
>>>> throw new IllegalStateException("Unknown staus code
>>>> detected. Code was: " + statusCode);
>>>>
>>>> }
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>> public boolean equals(final Object o) {
>>>>
>>>> if (this == o) return true;
>>>>
>>>> if (o == null || getClass() != o.getClass()) return
>>>> false;
>>>>
>>>>
>>>>
>>>> final StatusBlocked statusBlocked = (StatusBlocked) o;
>>>>
>>>>
>>>>
>>>> if (code != null ? !code.equals(statusBlocked.code) :
>>>> statusBlocked.code != null) return false;
>>>>
>>>>
>>>>
>>>> return true;
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>> public int hashCode() {
>>>>
>>>> return (code != null ? code.hashCode() : 0);
>>>>
>>>> }
>>>>
>>>> }
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>> package com.tietoenator.bekey.aucore.persistence;
>>>>
>>>>
>>>>
>>>> import javax.persistence.*;
>>>>
>>>>
>>>>
>>>> /**
>>>>
>>>> * User: mollekas
>>>>
>>>> * Date: 2007-06-26
>>>>
>>>> * Time: 14:29:18
>>>>
>>>> */
>>>>
>>>> @Entity
>>>>
>>>> public class DistMob {
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> @Id
>>>>
>>>> @GeneratedValue(strategy = GenerationType.IDENTITY)
>>>>
>>>> private String id;
>>>>
>>>>
>>>>
>>>> @ManyToOne
>>>>
>>>> @JoinColumn(name = "DistributorFK")
>>>>
>>>> private Distributor distributor;
>>>>
>>>>
>>>>
>>>> @ManyToOne
>>>>
>>>> @JoinColumn(name = "MobilePhoneFK")
>>>>
>>>> private MobilePhone mobilePhone;
>>>>
>>>>
>>>>
>>>> private String status;
>>>>
>>>>
>>>>
>>>> public void setDistributor(final Distributor distributor) {
>>>>
>>>> this.distributor = distributor;
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>> public void setMobilePhone(final MobilePhone mobilePhone) {
>>>>
>>>> this.mobilePhone = mobilePhone;
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>> public void setStatus(final Status status) {
>>>>
>>>> this.status = status.getCode();
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>> public Distributor getDistributor() {
>>>>
>>>> return distributor;
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>> public MobilePhone getMobilePhone() {
>>>>
>>>> return mobilePhone;
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>> public Status getStatus() {
>>>>
>>>> try {
>>>>
>>>> return Status.getStatus(status);
>>>>
>>>> } catch (IllegalStateException e) {
>>>>
>>>> throw new IllegalStateException("Status code unknown for
>>>> stairway with PK: " + id, e);
>>>>
>>>> }
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>> public DistMob(final Distributor distributor, final MobilePhone
>>>> mobilePhone, final Status status) {
>>>>
>>>> this.distributor = distributor;
>>>>
>>>> this.mobilePhone = mobilePhone;
>>>>
>>>> this.status = status.getCode();
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>> public DistMob() {
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>> public static class Status {
>>>>
>>>>
>>>>
>>>> /**
>>>>
>>>> * Blocked
>>>>
>>>> */
>>>>
>>>> public final static Status BLOCKED = new Status("BLOCKED");
>>>>
>>>>
>>>>
>>>> /**
>>>>
>>>> * Unblocked
>>>>
>>>> */
>>>>
>>>> public final static Status UNBLOCKED = new Status
>>>> ("UNBLOCKED");
>>>>
>>>>
>>>>
>>>> private final String code;
>>>>
>>>>
>>>>
>>>> private Status(final String code) {
>>>>
>>>> this.code = code;
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>> public String getCode() {
>>>>
>>>> return code;
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>> public static Status getStatus(final String statusCode){
>>>>
>>>> if(BLOCKED.getCode().equals(statusCode)){
>>>>
>>>> return BLOCKED;
>>>>
>>>> }
>>>>
>>>> else if(UNBLOCKED.getCode().equals(statusCode)){
>>>>
>>>> return UNBLOCKED;
>>>>
>>>> }
>>>>
>>>> else{
>>>>
>>>> throw new IllegalStateException("Unknown staus code
>>>> detected. Code was: " + statusCode);
>>>>
>>>> }
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>> public boolean equals(final Object o) {
>>>>
>>>> if (this == o) return true;
>>>>
>>>> if (o == null || getClass() != o.getClass()) return
>>>> false;
>>>>
>>>>
>>>>
>>>> final Status status = (Status) o;
>>>>
>>>>
>>>>
>>>> if (code != null ? !code.equals(status.code) :
>>>> status.code
>>>> != null) return false;
>>>>
>>>>
>>>>
>>>> return true;
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>> public int hashCode() {
>>>>
>>>> return (code != null ? code.hashCode() : 0);
>>>>
>>>> }
>>>>
>>>> }
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>> Med venlig hilsen / Kind regards
>>>> Kasper Møller
>>>> Konsulent / Consultant
>>>>
>>>>
>>>>
>>>> TietoEnator A/S
>>>> Healthcare & Welfare (HCWD-CSU)
>>>> Direct: +45 72 30 62 93
>>>> Mobile: +45 25 42 36 50
>>>> E-mail: kasper.moller_at_tietoenator.com
>>>> <mailto:kasper.moller_at_tietoenator.com>
>>>> Vesterbrogade 149
>>>> DK - 1620 København V
>>>> <http://www.tietoenator.com>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> -------------------------------------------------------------------
>>>> -----
>>>>
>>>> The next generation of MSN Hotmail has arrived - Windows Live
>>>> Hotmail
>>>> <http://www.newhotmail.co.uk>
>>>
>>

Craig Russell
Architect, Sun Java Enterprise System http://java.sun.com/products/jdo
408 276-5638 mailto:Craig.Russell_at_sun.com
P.S. A good JDO? O, Gasp!