2009-07-28 127 views
2

我真的不能使用实体bean,但他们现在正在盯着我。JPA实体映射没有可用的外键

我们有几个相互关联的表,但没有外键,我们也不能添加任何表。对于这个问题,数据库不能改变,这是不可能的,但作为一个不同的解决方案,我们可能会创建视图。无论如何...

我有3个表格。 LOCATION,LINKS和ENDPOINT和额外的盐,我们一个LINKS_TYPE表。

LOCATION表有一个主键LOCATIONID,它是一个包含位置ID的字符串。

LINKS表具有作为LINKID主键 列LINK_ATTR_VALUE_A包含端点的主键 列LINK_ATTR_VALUE_B其包含地点的主键。 其中包含了LINKS_TYPE主键

端点表中的列LINKTYPEID有一个主键点名

LINKS_TYPE已主键LINKTYPEID 列LINKTYPEA(定义表名的文本字符串它的链接) 列LINKTYPEB(文本字符串定义它链接到的表名称)

现在即使LINKS_TYPE被提及,我现在不需要担心,因为在这个数据库实例中没有其他链接。

我想在我的LOCATION实体中定义一个成员'List endPoints' 从我的理解中,这将是@OneToMany。 请记住,这里没有外键可以帮助,而且永远不会有。

这是我定义的,你可能会意识到我不知道我在做什么的映射......

@OneToMany (cascade=CascadeType.ALL) 
@JoinTable (name = "ENDPOINT", 
      joinColumns = @JoinColumn ( 
           name = "LINK_ATTR_VALUE_B" 
          ), 
      inverseJoinColumns = 
          @JoinColumn ( 
           name = "LINK_ATTR_VALUE_A" 
      ) 
      ) 
private List<EndPoint> endPoints; 

它很可能来自这样的:d 但文档AINT太大,并且Ive有序ejb 3帮助书,但我没有时间完成这本书映射之前:D

我们使用TopLink与jdeveloper 11g和该weblogic服务器事情和Oracle 10g作为数据库。

当使用serviceFacade客户端进行查询时,一切似乎都正确(因为工作空间已经死亡,我不得不重新创建项目以使客户端工作)。 它在我看来生成完美的查询来检索正确的数据。 然而,它没有结果。

我愿意给尽可能多的信息,只是不知道需要什么。 但我知道我的映射很可能是错误的,这是因为我不了解映射。

有人可以帮助我吗?

谢谢。

回答

2

LINKS表看起来像端点一到许多许多一对多映射表之间位置,而不是。这里最大的问题是除列出的LINKID,LINK_ATTR_VALUE_ALINK_ATTR_VALUE_B之外是否还有其他列?

如果确实如此,那么你就必须把它映射为一个独立的实体:
Location必须映射为双向的Links集合一个一对多
Link将有许多一对一的关系既LocationEndPoint

如果OTOH,LINKS没有其他列你愿意放弃它的主键(这既不需要也不可以被映射为许多一对多连接表)那么你可以将它映射为多对多的收藏EndPoint上的。

如果你可以澄清你的问题,我会更新我的答案,包括实际的映射,如果你需要它。

+0

谢谢。我会尝试一些你的建议,如果我仍然卡住,我会画出可爱的图表和所有那些jaz并张贴在这里:D thanx – guyumu 2009-07-29 09:06:30

+0

好的我正在成功地映射出我们的整个数据模型。 我会更新这个,我是怎么做到的......现在只需要做一些管理。 我选择你的文章作为答案,因为它解释了我可用的有效选项,以及我需要理解的概念。感谢那。 – guyumu 2009-07-29 14:48:37

0

这是我结束的映射。

@OneToMany(cascade=CascadeType.ALL) 
@JoinTable(name = "LINK", 
    joinColumns = { 
      @JoinColumn(name="LINK_ATTR_VALUE_B") 
     }, 
      inverseJoinColumns = { 
      @JoinColumn(name="LINK_ATTR_VALUE_A") 
      } 
) 
private List<EndPoint> endPoints; 

那里只是心不是真正的LINK表,现在所需要的任何值。但是,如果时间到了,我们的DBA将需要为我们或其他事物创建物化视图。

但attemting的映射时,我in​​itialy保持LINK,而不是直接去到端点。我正在返回5000+链接,应该只有133个。所以再次有一个我不明白的映射,但我会在稍后留下。

目前我们的数据库只包含1个链接类型。这将改变,并且我真的有办法让我在映射中添加一个附加的where子句,所以我可以为不同的类型设置不同的属性映射。

今天我在打字的心情:-D