Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[eclipselink-users] possible bug with Embeddables using ManyToOne?

Hello,

We are looking at EclipseLink as an ORM solution for a new project, so I was trying to adapt one of our existing mappings (using Hibernate) and ran into what looks like a bug in the 2.3.2 release.

If I take the following test entities:

@Entity
@Table(name = "product", schema = "ELTEST")
public class Product
  {
  @Id
  @Column(name = "product_id")
  Integer id;
  }

@Embeddable
public class CustomerOrder
  {
  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "product_id", referencedColumnName = "product_id")
  Product product;
  }


@Entity
@Table(name = "customer", schema = "ELTEST")
public class Customer
  {
  @Id
  @Column(name = "cust_id")
  Integer id;

  @ElementCollection(fetch = FetchType.LAZY)
  @CollectionTable(name = "cust_order",
                   joinColumns = @JoinColumn(name = "cust_id"))
  List<CustomerOrder> orders = new ArrayList<CustomerOrder>();
  }

Version 2.3.2 throws an exception:

Exception [EclipseLink-93] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.DescriptorException Exception Description: The table [cust_order] is not present in this descriptor. Descriptor: RelationalDescriptor(com.vtls.domain.test.Product --> [DatabaseTable(ELTEST.product)])

From some debugging, it appears that the both the source and target fields in the ManyToOne mapping in CustomerOrder is being set to cust_order.product_id, causing it to look for the wrong table descriptor when processing foreign keys.

The real target field name should be product.product_id. This seems to be messing up at some post-processing step, because when I check the original ManyToOneMapping created, it is using the proper field name (product.product_id) for the target.

I tried the previous 2.2.1 release, and this problem doesn't happen.

I also discovered that if I change the mapping so the join column name doesn't match the target column name:

@JoinColumn(name = "linked_product_id", referencedColumnName = "product_id")

It works in both releases. Unfortunately I can't do this in our production system since the schema is already created and in use. The problem only seems to happen if the owner of the OneToMany relationship is an Embeddable, not an Entity.

I'm pretty sure this is a bug and haven't been able to find anything similer in Bugzillla, but I wanted to be sure before entering a new one.


Back to the top