2011-04-02 107 views
1

我有两个表。复合主键选择 - Hibernate的哪些功能不适用于EclipseLink。为什么?

CREATE TABLE profile_table 
( 
    profile_id NUMBER(10,0) PRIMARY KEY, 
    creator_manager_id NUMBER(10,0), 
    lastupdate DATE, 
    description VARCHAR2(255 BYTE), 
    profile_name VARCHAR2(255 BYTE), 
    creatorname VARCHAR2(255 BYTE) 
); 

CREATE TABLE profile_basket_table 
( 
    profile_id NUMBER(10,0), 
    from_id NUMBER(10,0), 
    action NUMBER(10,0), 
    constraint pbt_pk_constraint PRIMARY KEY(profile_id, from_id), 
    constraint pbt_fk_constraint FOREIGN KEY(profile_id) REFERENCES profile_table(profile_id) 
); 

我有1个配置文件和* ProfileItem。

1配置文件--- * ProfileItems(一个配置文件可以有许多ProfileItems)。

注意:1.它是一个从profile到profileItem的一对多关系。 2.它是一种单向关系。

配置文件的PK是profile_id。

的PK ProfileItem是一个复合主键(PROFILE_ID,from_id)

首先,我想我喜欢抱怨的EclipseLink不工作,如Hibernate:

1日问题与EclipseLink的: 只是becasue我有一个名为ProfileItem的子实体中的复合主键,它迫使我使用JoinColumns。我不能使用@JoinColumns作为其他列from_id不是任何其他表的外键。

@Entity 
@Table(name="profile_table") 
class Profile { 

    @Id 
    @Column(name="profile_id") 
    private Integer profileId ; 
    ... 

    /** 
    * WORKS WITH HIBERNATE AS PERSISTENCE PROVIDER, BUT FAILS WITH ECLIPSELINK 
    */ 
    @OneToMany(cascade = CascadeType.ALL) 
    @JoinColumn(name= "profile_id", referencedColumnName="profile_id") 
    private Set<XVMUpdateProfileItem> profileItems = null; 

    ... 
} 

以上代码抛出下面的错误与EclipseLink的: 我最初使用与Hibernate的完美工作如下相同注释

The @JoinColumns on the annotated element [field profileItems] from the entity class [class arun.ucerelay.datastructures.XVMUpdateProfile] is incomplete. When the source entity class uses a composite primary key, a @JoinColumn must be specified for each join column using the @JoinColumns. Both the name and the referencedColumnName elements must be specified in each such @JoinColumn. 

一些如何与几个排列@JoinColumn注解的组合,我管理让这个工作负载配置文件和相关的配置文件项目。

/** 
* WORKS WITH ECLIPSELINK AS PERSISTENCE PROVIDER 
*/ 

@OneToMany(cascade = CascadeType.ALL) 
@JoinColumns({ 
    @JoinColumn(name= "profile_id", referencedColumnName="profile_id" , insertable = true, updatable = true), 
    @JoinColumn(name= "profile_id", referencedColumnName="profile_id" , nullable = false)  
}) 
private Set<XVMUpdateProfileItem> profileItems = null; 

这没有意义再次声明@JoinColumn ...但奇怪的是它与eclipselink工作。这是一个错误。不是吗?

任何人都可以告诉我,如果我失去了什么?有没有其他正确的方式来实现单向关系,请告诉我。

这是一个关于@JoinColumns的bug吗?我应该登录吗?

这就是所谓的“便携性”从一个持久性提供者到另一个??????? 如果它不解决可移植性,那么使用JPA规范有什么用处。

保存父级和级联子项的第二个问题与休眠一起使用,并且不适用于eclipselink。我把它作为一个单独的问题发布,以保持简洁和精确。

谢谢。 Arun Kandregula

+0

作为参考,DataNucleus将(http://www.datanucleus.org)适用于该元数据细;只有一个@JoinColumn,因为这是识别ProfileItem中链接回配置文件(具有单个PK字段)的FK。 – DataNucleus 2011-04-02 14:38:49

回答

2

这似乎是注解处理中的一个错误。如果它仍然出现在最新版本上,请在EclipseLink上记录此错误。

请注意@JoinColumn通常用于@ManyToOne或@OneToOne,而不是@OneToMany。通常@OneToMany你应该有一个反@ManyToOne并使用mappedBy。在@OneToMany上使用@JoinColumn是@OneToMany的一种特殊类型,它维护目标表的外键本身。由于profile_id是主键的一部分,为了正确,您应该返回@ManyToOne,然后可以移除profileId并将@Id添加到@ManyToOne。

+0

已经有一个bug在2.3版本中似乎已经修复。 (https://bugs.eclipse.org/bugs/show_bug.cgi?id=336122)。另外,在这里我使用@OneToMany上的@JoinColumn,因为我打算实现单向关系。所以我不想添加@ManyToOne。你能告诉我如何删除profileId,只需将@Id添加到@ManyToOne?我不明白你最后的声明。 – 2011-04-06 18:30:59

0

我继承了这样的代码(和工作与休眠罚款):

@OneToMany @JoinColumn(name = “prod_no”,referencedColumnName = “prod_no”) 私人珍藏物品;

joinColumn用于一对多)

+0

Hibernate工作正常。问题在于旧版本的eclipselink。 – 2011-04-15 06:04:37

相关问题