与错误字段上的 referencedColumnName 映射一对一

One to one with referencedColumnName mapping on wrong field

我在一对一关系中遇到问题。我有 2 tables,一篇文章有​​ 1 个 FK“FICHE_ID”引用了第二个 table 的 id Fiche(ID_FICHE),问题是 JPA 是没有在正确的字段上映射,需要 ID_ARTICLE 来映射 ID_FICHE 而不是 FICHE_ID。 这是下面的代码:

@Entity
@Table(name="ARTICLE")
public class Article  implements Serializable{
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="ID_ARTICLE")
Integer id=0;

@Column(name="ENTREPRISE")
private String entreprise;

@Column(name="CODE_ARTICLE")
private String code;

@Column(name="LIBELLE_ARTICLE")
private String libelle;

@Column(name="ROLE_READ")
private String role;

@Column(name="PRIX")
private int prix;

@Column(name="OBLIGATOIRE")
private String obligatoire;

@NaturalId
@Column(name="TAILLE_CODE")
private String tailleCode;

@NaturalId
@Column(name="FICHE_ID")
private Integer ficheId;

@OneToOne(fetch = FetchType.EAGER,mappedBy="article")
FicheArticle fiche;

@Entity
@Table(name="FICHE")
public class FicheArticle {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="ID_FICHE",insertable = false,updatable = false)
private Integer id=0;
@Lob
@Column(name="FICHE",insertable = false,updatable = false)
private byte[] fiche;
@Lob
@Column(name="FICHE")
private Blob ficheBlob;
@Column(name="ENTREPRISE")
private String entreprise;
@OneToOne
@JoinColumn(name="ID_FICHE", referencedColumnName = "FICHE_ID")  
private Article article;

拜托,你能帮帮我吗?

我不确定我理解你的问题;但看起来有些事情需要改变。由于外键由 ARTICLE table 持有,您不能在 Article.fiche 映射上使用 mappedBy。相反,您应该在 Article.fichemappedBy 上指定适当的连接列 Fiche.article:

@Entity
@Table(name = "ARTICLE")
public class Article  implements Serializable {

private static final long serialVersionUID = 1L;
    
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID_ARTICLE")
Integer id = 0;

// ...

@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "FICHE_ID", referencedColumnName = "ID_FICHE")
FicheArticle fiche;

@Entity
@Table(name = "FICHE")
public class FicheArticle {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID_FICHE", insertable = false, updatable = false)
private Integer id = 0;

// ...

@OneToOne(mappedBy = "fiche")
@JoinColumn(name="ID_FICHE", referencedColumnName = "FICHE_ID")  
private Article article;

另外,我猜 Article.ficheId 而不是 Article@NaturalId;所以你应该简单地删除字段(及其映射)。