我并没有真正开始使用实体 bean,但它们现在正盯着我看。
我们有几个相互关联的表,但是没有外键,我们不能添加任何外键。对于这个问题,数据库不能改变,这是不可能的,但作为一个不同的解决方案,我们可能会创建 View 。无论如何...
我有 3 个表。 LOCATION 、 LINKS 和 ENDPOINT 以及额外的盐,我们有一个 LINKS_TYPE 表。
LOCATION 表有一个主键 LOCATIONID,它是一个包含位置 ID 的字符串。
LINKS 表有一个 LINKID 作为主键 包含 ENDPOINT 主键的 LINK_ATTR_VALUE_A 列 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 客户端进行查询时,一切似乎都是正确的(从那时起工作区就死了,我必须重新创建项目才能让客户端工作)。 在我看来,它生成完美的查询以检索正确的数据。 然而,它没有结果。
我愿意提供尽可能多的信息,只是不确定需要什么。 但我知道我的映射很可能是错误的,这是因为我不理解映射。
有人可以帮助我吗?
谢谢。
最佳答案
您的LINKS 表看起来像LOCATION 和ENDPOINT 之间的多对多映射表,而不是一对多。这里的一个大问题是,除了您列出的 LINKID
、LINK_ATTR_VALUE_A
和 LINK_ATTR_VALUE_B
之外,它是否还有其他列?
如果是,那么您必须将其映射为一个单独的实体:
Location
会将一组 Links
映射为双向一对多
Link
将与 Location
和 EndPoint
如果,OTOH,LINKS 没有其他列并且您愿意放弃它的主键(既不需要也不能映射到多对-许多连接表),那么您可以将其映射为 Location
上的 EndPoint
的多对多集合。
如果您能澄清您的问题,我会更新我的答案以在您需要时包含实际映射。
关于java - 没有可用外键的 JPA 实体映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1195480/