如何在没有主键的情况下使实体脱离连接表

时间:2010-03-25 10:22:46

标签: java sql hibernate orm jpa

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

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

我尝试使用Dali JPA Tools从数据库结构中生成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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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

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