Java 没有外键的JPA实体映射

Java 没有外键的JPA实体映射,java,jpa,ejb-3.0,toplink,jdeveloper,Java,Jpa,Ejb 3.0,Toplink,Jdeveloper,我并没有真正开始使用实体bean,但它们现在正盯着我看 我们有两个相互关联的表,但是没有外键,我们不能添加任何外键。对于这个问题,数据库无法更改,这是不可能的,但是作为一种不同的解决方案,我们可以创建视图。无论如何 我有三张桌子。 位置、链接和端点,对于额外的salt,我们使用LINKS\u类型的表 位置表有一个主键LOCATIONID,它是一个包含位置id的字符串 链接表具有作为主键的LINKID 包含端点主键的列链接\u ATTR\u VALUE\u a 包含位置主键的列链接属性值。 包含链

我并没有真正开始使用实体bean,但它们现在正盯着我看

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

我有三张桌子。 位置、链接和端点,对于额外的salt,我们使用LINKS\u类型的表

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

链接表具有作为主键的LINKID 包含端点主键的列链接\u ATTR\u VALUE\u a 包含位置主键的列链接属性值。 包含链接类型主键的列LINKTYPEID

端点表具有主键POINTID

LINKS\u类型具有主键LINKTYPEID 列LINKTYPEA(定义链接到的表名的文本字符串) 列LINKTYPEB(定义链接到的表名的文本字符串)

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

我想在我的位置实体“列出端点”中定义一个成员 据我所知,这将是一个“一个女人”。 请记住,这里没有外键可以帮助您,而且永远不会有

这是我定义的映射

@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;
@OneToMany(cascade=CascadeType.ALL)
@JoinTable(name=“ENDPOINT”,
joinColumns=@JoinColumn(
name=“链接属性值”
),
反向连接列=
@列(
name=“链接属性值”
)
)
私有列表端点;
很有可能你会意识到我不知道我在做什么:D 但是文档不是很好,我订购了一本关于EJB3的帮助书,但是我没有时间在映射之前完成这本书:D

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

当使用serviceFacade客户机进行查询时,一切似乎都是正确的(从那时起,工作区消失了,我必须重新创建项目以使客户机工作)。 在我看来,它生成了检索正确数据的完美查询。 然而,它最终没有结果

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

有人能帮我吗


谢谢。

您的链接表看起来像是位置端点之间的多对多映射表,而不是一对多映射表。这里的大问题是,除了您列出的
LINKID
LINK\u ATTR\u VALUE\u A
LINK\u ATTR\u VALUE\u B
之外,它是否还有其他列

如果有,则必须将其映射为单独的实体:
位置
将有一组
链接
映射为双向一对多
链接
位置
端点

如果,OTOH,链接没有其他列,并且您愿意放弃它的主键(对于多对多联接表既不需要也不能映射),那么您可以将它映射到
位置
上的
端点
的多对多集合


如果您能澄清您的问题,我将更新我的答案,以包括实际的映射(如果您需要)。

这是我结束的映射

@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;
@OneToMany(cascade=CascadeType.ALL)
@JoinTable(name=“LINK”,
joinColumns={
@JoinColumn(name=“链接属性值”)
},
反向连接列={
@JoinColumn(name=“LINK\u ATTR\u VALUE\u A”)
}
)
私有列表端点;
现在在链接中没有真正需要的值。 但到时候,我们的DBA将需要为我们或其他人创建物化视图

但是在尝试映射时,我最初保留了链接,而不是直接指向端点。我被返回5000+链接,其中应该只有133个。还有一个映射我不明白,但我会留待以后

目前我们的数据库只包含1个链接类型。这将改变,我确实知道有一种方法可以为映射添加一个额外的where子句,,这样我就可以为不同的类型创建不同的属性映射


我今天心情很好:-D

谢谢。我将尝试你的一些建议,如果我仍然被卡住,我将画出可爱的图表和所有的jaz,然后发布在这里:D thanxok我至少成功地绘制出了我们的整个数据模型。我会更新我是怎么做的。。。现在只需要做一些管理。我选择你的帖子作为答案,因为它解释了我可用的有效选项,以及我需要理解的概念。谢谢。您应该将上面的映射更改为ManyToMany。一旦你这样做了,“where子句”将被隐式地添加到LINK_ATTR_VALUE_B中。OneToMany是指文件夹/文件,其中给定的文件只属于一个文件夹;然而,许多例子是作者/书,其中书可以由多个作者编写,作者可以编写许多书。许多人总是需要一个连接表(例如位置/端点之间有链接),一个人可能有,但通常没有。非常感谢。我一定会尝试一下:D