Hi,
 You can retain existing behavior but change the mapping. Is not that the
idea of O-R mapping?

  public class Phone {
  @ManyToOne
  @ Column(name=" ADDR_FK_ID",nullable=true)
  private Address address;
  
  @Transient
  private long addressId;

  public Address getAddress() {
      return address;
  }

  // notice package level access. Only Address from the same package should
access
  void setAddress(Address addr) {
       this.address = addr;
       this.addressId = addr.getId();
  }

  public long getAddressId() {
       return addressId;
  }

  // no setter for addressId



Madhu Kalaimalai wrote:
> 
> Hi Pinaki
> 
> Thanks for the reply.
> 
> I tried the bidirectional too with nullable true on the many-to-one side.
> 
> The problem being i have the existing code which uses addressId mapping
> <1> below, I can't replace this with Address <2> mapping below becoz the
> old code will not work which is using directly the identifier.
> 
> The objective now is to bring the relation with out affecting the existing
> code which doesn't have the relations built
> 
> <1>
> @Basic() 
> @ Column(name=" ADDR_FK_ID",nullable=true) 
> public Long getAddressId() 
> { 
> return this.addressId; 
> } 
> 
> <2>
> 
> Phone.java 
> @ManyToOne 
> @ Column(name=" ADDR_FK_ID",nullable=true) 
> private Address address; 
> 
> When I try this option, I get the following error
> 
> ORA-00957: duplicate column name 
> 
> as I have both the mapping for the ADDR_FK_ID ie the column and the
> many-to-one.
> 
> My question is there a way to selective turn off the column mapping when
> going through the relation mapping . I thought of options like Embedded or
> using an Interface etc,
> 
> As I said earlier, The existing code have simple pojos mapping one class
> to one table w/o relationships built. We want to bring in object relation
> for object graph persistence. Right now the developer writes code to
> persist the data row by row rather than passing the object graph to
> persist.
> 
> Rgds
> Madhu
> 
> 
> Pinaki Poddar wrote:
>> 
>> Hi,
>> 1. The mapping can be simplified as follows:
>> Address.java:
>> @OneToMany(mappedBy="address", cascade={CascadeType.ALL},
>> fetch=FetchType.LAZY)
>> private java.util.Set<Phone> phones;
>> 
>> Phone.java
>> @ManyToOne
>> @ Column(name=" ADDR_FK_ID",nullable=true)
>> private Address address;
>> 
>> 2. It will get rid of the two independent mappings trying to update the
>> same ADDR_FK_ID column.
>> 
>> 3. Domain model should ensure referential consistency at object level.
>> For example,
>> Address.java:
>>    public void addPhone(Phone phone) {
>>         phones.add(phone);
>>         phone.setAddresss(this);
>>     }
>> 
>> Phone.java:
>>   // notice package level accss 
>>   void setAddress(Address addr) {
>>        this.address = addr;
>>   }
>> 
>>   You can ask OpenJPA to manage consistency of inverse relations but at
>> the cost of slight performance penalty.
>> 
>> 4. In O-R mapping, it makes more sense to work with object references
>> than with identifiers -- that is why Phone should declare a field of
>> Address type rather than a Long which is primary identifier of Address.
>> 
>> 
> 
> 

-- 
View this message in context: 
http://n2.nabble.com/OpenJPA---two-sided-relation-between-objects-Issue-tp687050p720156.html
Sent from the OpenJPA Users mailing list archive at Nabble.com.

Reply via email to