我真的不能使用实体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客户端进行查询时,一切看起来都是正确的(从那时起工作空间就死了,我必须重新创建项目以使客户端正常工作)。 在我看来,它会生成完美的查询以检索正确的数据。 然而,它没有结果。
我愿意尽可能多地提供信息,但不确定需要什么。 但我知道我的映射很可能是错误的,这是因为我不理解映射。
有人可以帮助我吗?
谢谢。
答案 0 :(得分:2)
您的 LINKS 表格似乎是 LOCATION 和 ENDPOINT 之间的多对多映射表,而不是一对多。这里最大的问题是除了您列出的LINKID
,LINK_ATTR_VALUE_A
和LINK_ATTR_VALUE_B
之外是否还有其他列?
如果确实如此,则必须将其映射为单独的实体:
Location
会将Links
的集合映射为双向一对多的
Link
与Location
和EndPoint
具有多对一关系
如果,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