openjpa-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Frank Schwarz (JIRA)" <j...@apache.org>
Subject [jira] Commented: (OPENJPA-692) Bi-directional One-to-Many mapping with a JoinTable fails for Update or Delete operation
Date Sun, 10 Aug 2008 08:09:44 GMT

    [ https://issues.apache.org/jira/browse/OPENJPA-692?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12621217#action_12621217
] 

Frank Schwarz commented on OPENJPA-692:
---------------------------------------

I did some additional testing with Hibernate3. It seems that Hibernate is very robust on this
topic.

The following mappings worked as expected:
1.
@Entity
public class Person {

	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE)
	private long id;

	@OneToMany(mappedBy = "person", cascade = CascadeType.ALL)
	@JoinTable(name="PERSON_ADDRESS",
                  joinColumns=@JoinColumn(name="PERSON_ID", referencedColumnName="ID"),
                  inverseJoinColumns=@JoinColumn(name="ADDRESS_ID", referencedColumnName="ID"))
	private Set<Address> addresses = new HashSet<Address>();
}

@Entity
@SecondaryTable(name="PERSON_ADDRESS", pkJoinColumns=@PrimaryKeyJoinColumn(name="ADDRESS_ID"))
public class Address {

	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE)
	private long id;

	@ManyToOne
	@JoinColumn(table="PERSON_ADDRESS", referencedColumnName="ID")
	private Person person;
}
------%<----------------

2.
@Entity
public class Person {

	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE)
	private long id;

	@OneToMany(mappedBy = "person", cascade = CascadeType.ALL)
	private Set<Address> addresses = new HashSet<Address>();
}

@Entity
@SecondaryTable(name="PERSON_ADDRESS", pkJoinColumns=@PrimaryKeyJoinColumn(name="ADDRESS_ID"))
public class Address {

	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE)
	private long id;

	@ManyToOne
	@JoinColumn(table="PERSON_ADDRESS") 
	private Person person;
}
------%<----------------

3.
@Entity
public class Person {

	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE)
	private long id;

	@OneToMany(mappedBy = "person", cascade = CascadeType.ALL)
	private Set<Address> addresses = new HashSet<Address>();
}

@Entity
public class Address {

	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE)
	private long id;

	@ManyToOne
	@JoinTable(name="PERSON_ADDRESS", joinColumns=@JoinColumn(name="ADDRESS_ID"))
	private Person person;
}


Not working with Hibernate is leaving out the "mappedBy" attribute of the Person.addresses
field annotation in the first mapping example.

Personally, I would like to see the third example mapping working. It uses minimal annotations
but remains semantically understandable. And it conforms with the spirit of JSR220 disapproving
additional annotations on a "mapped-by" field.

> Bi-directional One-to-Many mapping with a JoinTable fails for Update or Delete operation
> ----------------------------------------------------------------------------------------
>
>                 Key: OPENJPA-692
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-692
>             Project: OpenJPA
>          Issue Type: Bug
>            Reporter: Pinaki Poddar
>            Assignee: Pinaki Poddar
>             Fix For: 1.3.0
>
>
> Originally reported in user group message [1] by Frank Schwarz 
> If
> a) Entities A and B that are related in a one-to-many and many-to-one bi-directional
relation (typical Parent-Child pattern)
> b) mapped using a JoinTable instead of conventional mappedBy 
> then
> update/delete operation fails with OptimisticException (which itself is a catch-all and
sometimes misleading). 
> Typical mapping that encounters this error:
> public class Person {
> 	@Id
> 	private long ssn;
> 	
> 	@OneToMany(cascade=CascadeType.ALL)
> 	@JoinTable(name="J_PERSON_ADDRESSES",
> 			joinColumns               = @JoinColumn(name="PERSON_SSN",    referencedColumnName="SSN"),
> 			inverseJoinColumns = @JoinColumn(name="ADDRESS_PHONE", referencedColumnName="PHONE"))
>     private Set<Address> addresses = new HashSet<Address>();
> public class Address {
>    @Id
>    private String phone;
> 	
>     @ManyToOne
>     @JoinColumn(table="J_PERSON_ADDRESSES", referencedColumnName="SSN")
>     private Person person;
> [1] http://n2.nabble.com/bidirectional-one-to-many-relationship-with-join-table-tc678479.html

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message