如何使一个实体脱离没有主键的连接表

问题描述:

我试图从具有“有趣”设计的现有数据库中生成JPA实体。如何使一个实体脱离没有主键的连接表

数据库有一个名为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 

如果您希望在不更改数据库的情况下映射此映射,则可能需要考虑尝试将UserSet类映射为具有多对多关系的实体,以及与LinkedUserSet作为连接表,以便映射真正反映数据库中的内容。

您还是应该添加一个独特的PK列到LinkedUserSets表。这将有助于巩固这张桌子。

您可能还希望在LinkedUserSets(UsrSetId,ChildId)上创建一个索引(唯一?)以加快查找速度。

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

+0

我不能冒修改数据库结构的风险。它可能会利用同一个数据库打破“其他”。 这不是DB中唯一“有趣”的部分:-) – tputkonen 2010-03-25 12:55:10