没有外键的JPA实体映射

时间:2009-07-28 17:13:59

标签: java jpa ejb-3.0 toplink jdeveloper

我真的不能使用实体bean,但他们现在正盯着我看。

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

我有3张桌子。 LOCATION,LINKS和ENDPOINT以及额外的盐,我们是一个LINKS_TYPE表。

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

LINKS表有一个LINKID作为主键       列LINK_ATTR_VALUE_A,其中包含ENDPOINT的主键       列LINK_ATTR_VALUE_B,其中包含LOCATION的主键。       包含LINKS_TYPE主键的列LINKTYPEID

ENDPOINT表有一个主键POINTID

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 但是文档太棒了,我已经订购了一本书来帮助ejb 3,但我没有时间在这个映射之前完成这本书:D

我们正在使用TopLink和jdeveloper 11g以及weblogic服务器和oracle 10g作为数据库。

当使用serviceFacade客户端进行查询时,一切看起来都是正确的(从那时起工作空间就死了,我必须重新创建项目以使客户端正常工作)。 在我看来,它会生成完美的查询以检索正确的数据。 然而,它没有结果。

我愿意尽可能多地提供信息,但不确定需要什么。 但我知道我的映射很可能是错误的,这是因为我不理解映射。

有人可以帮助我吗?

谢谢。

2 个答案:

答案 0 :(得分:2)

您的 LINKS 表格似乎是 LOCATION ENDPOINT 之间的多对多映射表,而不是一对多。这里最大的问题是除了您列出的LINKIDLINK_ATTR_VALUE_ALINK_ATTR_VALUE_B之外是否还有其他列?

如果确实如此,则必须将其映射为单独的实体:
 Location会将Links的集合映射为双向一对多的  LinkLocationEndPoint具有多对一关系

如果,OTOH, LINKS 没有其他列 AND ,您愿意放弃其主键(既不需要也不能映射多个 - 许多连接表)然后你可以在EndPoint上将它映射为Location的多对多集合。

如果您能澄清您的问题,我会更新我的答案,以便在您需要时包含实际的地图。

答案 1 :(得分: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需要为我们或其他东西创建物化视图。

但是在确定映射时,我最初保留了 LINK ,而不是直接进入 endPoint 。我正在返回5000+链接,其中应该只有133.所以再次有一个我不理解的映射,但我会留待以后。

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

今天我正处于打字状态:-D