Hibernate注释用于映射与复合主键的一对一单向关联

时间:2017-03-16 16:55:48

标签: java hibernate one-to-one composite-primary-key

我有两张桌子:报告和扉页。报告由“ID”标识。和一个'索引'这是扉页中的外键和主键。

表的架构是:

CREATE TABLE `report` (
   `id` int(11) NOT NULL,
   `index` varchar(5) NOT NULL,
   `nb_page` int(11) DEFAULT NULL
); 
ALTER TABLE `report` ADD PRIMARY KEY (`id`,`index`);

CREATE TABLE `flyleaf_t` (
   `id` int(11) NOT NULL,
   `index` varchar(5) NOT NULL,
   `title` varchar(30) DEFAULT NULL,
   `author` varchar(30) DEFAULT NULL,
   `checker` varchar(30) DEFAULT NULL
);
ALTER TABLE `flyleaf` ADD PRIMARY KEY (`id`,`index`);
ALTER TABLE `flyleaf` ADD CONSTRAINT `flyleaf_ibfk_1` FOREIGN KEY (`id`,`index`) REFERENCES `report` (`id`, `index`);

我使用Hibernate注释以单向方式映射此关联。当我使用简单的键(非复合键)时,它显然很有效,但是当我尝试使用复合键时," org.hibernate.TypeMismatchException"抛出消息:"为类lgmi_cr.Flyleaf提供了错误类型的id。预期:上课lgmi_cr.Flyleaf,上课了lgmi_cr.Report"

如果有人已经看到相同的案例或者想知道如何以单向一对一的方式表示这种关联,那么我们将非常感谢它的帮助。

编辑:这就是Id执行映射的方式

@Entity
@Table(name="report")
public class Report implements Serializable{

    @Id
    @Column(name = "id")
    private int id;

    @Id
    @Column(name = "index")
    private String index;

    @OneToOne 
    @JoinColumns({@JoinColumn(name="id", referencedColumnName="id"),
            @JoinColumn(name="index", referencedColumnName="index")})
    private Flyleaf flyleaf;
...

@Entity
@Table(name="flyleaf")
public class Flyleaf implements Serializable {

    @Id
    @Column(name = "id")
    private int id;

    @Id
    @Column(name = "index")
    private String index;
....

我得到了这个异常" org.hibernate.TypeMismatchException:为类lgmi_cr.Flyleaf提供了错误类型的id。预期:上课lgmi_cr.Flyleaf,上课了lgmi_cr.Report"

1 个答案:

答案 0 :(得分:2)

我希望你能分享一下你如何在Hibernate中映射这些关系?我就是这样做的:

1)使用@Embeddable注释将每个复合表映射为单独的类对象,例如:

@Embeddable
public class ReportPK implements Serializable {

  @Basic(optional = false)
  @Column(name="id")
  private int id;
  @Basic(optional = false)
  @Column(name="index")
  private String index;
...

实体类看起来像:

@Table(name="report")
public class Report implements Serializable {

  @EmbeddedId
  protected ReportPK id;
...

2)在flyleaf实体类中,您可以将单向映射添加为:

@OneToOne
  @JoinColumns({
    @JoinColumn(name="id",
      referencedColumnName="id"),
    @JoinColumn(name="index",
      referencedColumnName="index"),
  })
  private Report report;
...

如果这没有帮助,也许你会更具体。 : - )