Hi Pinaki
Your suggestion is valid.
But i don't want to make the addressId as transient and we still want the
existing code to work with out refactoring it.
Can we say dynamically say that addressId is transient at runtime ?
Rgds
Madhu
Pinaki Poddar wrote:
>
> 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-tp687050p720224.html
Sent from the OpenJPA Users mailing list archive at Nabble.com.