休眠批注,用于将一对一的单向关联映射到复合主键



我有两个表:报告和飞叶。报告由"id"和"索引"标识,它们是 flyleaf 表中的外键和主键。

表的架构为:

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提供了错误类型的 id。衬页。预期:类lgmi_cr。飞叶,上了lgmi_cr班。报告">

如果有人已经看到相同的案例或知道如何以单向一对一的方式表示此关联,将不胜感激。

编辑:这就是 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提供了错误类型的id。衬页。预期:类lgmi_cr。飞叶,上了lgmi_cr班。报告">

我希望你能分享一下你在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;
...

如果这没有帮助,也许你可以更具体。

最新更新