如何在没有主键的情况下从连接表中创建实体

Posted

技术标签:

【中文标题】如何在没有主键的情况下从连接表中创建实体【英文标题】:How to make an entity out of a join table without primary key 【发布时间】:2010-03-25 10:22:46 【问题描述】:

我正在尝试从具有“有趣”设计的现有数据库中生成 JPA 实体。

Database 有一个名为 UserSet 的表,它可以链接到其他几个 UserSet。 UserSets 和 LinkedUserSets 之间存在一对多的关系。 LinkedUserSets 也与 UserSets 具有一对一的关系。

我尝试使用 Dali JPA 工具从数据库结构中生成一个 JPA 实体。生成的实体 Linkeduserset 缺少 @Id 或 @EmbeddedId 注释,因此无法编译。由于生成的实体仅包含两个 @JoinColumns(不能标记为 @Id),因此我到目前为止还没有找到解决此问题的方法。

不能以任何方式修改数据库结构。

有没有办法克服这个问题?

create table 语句的相关部分:

CREATE  TABLE `LinkedUserSets` (
  `UsrSetID` INT(11) NOT NULL DEFAULT '0' ,
  `ChildID` INT(11) NOT NULL DEFAULT '0' ,
  CONSTRAINT `fk_LinkedUserSets_UserSet1`
    FOREIGN KEY (`UsrSetID` )
    REFERENCES `UserSet` (`UsrSetID` ));

CREATE  TABLE `UserSet` (
  `UsrSetID` INT(11) NOT NULL AUTO_INCREMENT ,
  PRIMARY KEY (`UsrSetID`),
  CONSTRAINT `fk_UserSet_LinkedUserSets1`
    FOREIGN KEY (`UsrSetID` )
    REFERENCES `LinkedUserSets` (`ChildID` ));

生成的实体:

@Entity
@Table(name="linkedusersets")
public class Linkeduserset 
    //bi-directional many-to-one association to Userset
    @ManyToOne
    @JoinColumn(name="UsrSetID")
    private Userset userset1;

    //bi-directional one-to-one association to Userset
    @OneToOne
    @JoinColumn(name="ChildID")
    private Userset userset2;



@Entity
@Table(name="userset")
public class Userset 
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name="UsrSetID")
    private int jngSetID;

    //bi-directional many-to-one association to Linkeduserset
    @OneToMany(mappedBy="userset1")
    private Set<Linkeduserset> linkedusersets;

    //bi-directional one-to-one association to Linkeduserset
    @OneToOne(mappedBy="userset2")
    private Linkeduserset linkeduserset;

错误信息:

Entity "Linkeduserset" has no Id or EmbeddedId

【问题讨论】:

【参考方案1】:

如果您希望在不更改数据库的情况下进行映射,您可能需要考虑尝试仅将 UserSet 类映射为与其自身具有多对多关系的实体,并将 LinkedUserSet 作为连接表,以便映射确实反映了数据库中的内容。

【讨论】:

【参考方案2】:

您仍应将唯一的 PK 列添加到 LinkedUserSets 表。这将有助于巩固这张桌子。

您可能还想在 LinkedUserSets(UsrSetId, ChildId) 上创建一个索引(唯一的?)以便更快地查找。

...这不是一个“有趣”的设计。这很常见:)

【讨论】:

我不能冒险修改数据库结构。它可能会破坏使用相同数据库的“其他东西”。这不是数据库中唯一“有趣”的部分 :-)

以上是关于如何在没有主键的情况下从连接表中创建实体的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有主键的情况下从 mySQL 中的两个表中获取不常见的记录

快速 SQL 问题:在 H2 中创建具有主键的表的正确语法?

如何首先在实体框架代码中设置身份主键的起始值?

我可以在没有自动 ID 的情况下在 Django 中创建模型吗?

如何在 SQL Server 中创建聚集索引,同时仍保留主键?

如何在不影响 phpMyAdmin 的情况下从 mysql 中巧妙地删除 pma 表