具有反向外键的单向@OneToOne

Mar*_*ila 6 hibernate jpa jpa-2.0

我们想@OneToOne使用外键创建单向映射,该外键不在主表中,而在从表中。通过提供以下Java代码,Hibernate尝试product_ID在表中查找列,product但不在中查找列productimage。是否可以使其仅对注释进行修改?

该示例中删除了所有不必要的字段和列。

JPA实体:

@Entity
public class Product {

    @Id
    @Column(name = "ID", unique = true)
    private String id;

    // this doesn't work
    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "product_ID", nullable = false)
    private ProductImage productImage;

    // this works, but we want one-to-one
    // @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
    // @JoinColumn(name = "product_ID", nullable = false)
    // private List<ProductImage> productImages;

    // getters/setters omitted
}

@Entity
public class ProductImage {

    @Id
    @Column(name = "ID", unique = true)
    private String id;

    @Column
    @Lob
    private Blob data;

    // getters/setters omitted
}
Run Code Online (Sandbox Code Playgroud)

数据库表:

CREATE TABLE `product` (
  `ID` varchar(255) NOT NULL,
  PRIMARY KEY (`ID`)
)

CREATE TABLE `productimage` (
  `ID` varchar(255) NOT NULL,
  `data` longblob NOT NULL,
  `product_ID` varchar(255) NOT NULL,
  PRIMARY KEY (`ID`),
  KEY `FK_123` (`product_ID`),
  CONSTRAINT `FK_123` FOREIGN KEY (`product_ID`) REFERENCES `product` (`ID`)
)
Run Code Online (Sandbox Code Playgroud)

Ale*_*sky 1

@OneToOne 有点误导。它很可能与您想要的不同。在大多数情况下,经典数据库“一对一”关系是通过 @ManyToOne JPA 注释建模的。尝试一下。通过 @ManyToOne 和 @JoinColumn 的单向关系从来没有遇到过问题。我还在第二个类中明确指定了productId 字段。