我正在使用 Hibernate 4.3.6.Final 和 WildFly 16。@OneToOne 关系有两个问题。
1.) 第一个问题:Unknown mappedBy in: at.home.digest.model.Expose.home, 引用属性unknown: at.home.digest.model.Home.expose"}}
这些是我的实体:
@Entity
@Table(name = "home",
uniqueConstraints = @UniqueConstraint (columnNames = {"URL"})
)
@Access(AccessType.FIELD)
public class Home implements Serializable {
@OneToOne (fetch = FetchType.LAZY, mappedBy = "home", cascade = CascadeType.ALL)
@JoinColumn(name = "expose_id")
private Expose expose;
public Expose getExpose() {
return expose;
}
public void setExpose(Expose expose) {
this.expose = expose;
}
................
}
公开实体:
@Entity
@Table(name ="expose")
@Access(AccessType.FIELD)
public class Expose implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name = "id", updatable=false, nullable=false)
private int id;
@OneToOne (fetch = FetchType.EAGER, mappedBy = "expose", cascade=CascadeType.PERSIST )
@JoinColumn(name = "home_id")
private Home home;
@ManyToOne ( optional = false, cascade=CascadeType.MERGE )
@JoinColumn(name = "contact_id")
private Contact contact;
}
部署应用程序后,我收到:
Caused by: org.hibernate.AnnotationException: Unknown mappedBy in: at.home.digest.model.Expose.home, referenced property unknown: at.home.digest.model.Home.expose"}}
2.) 第二个问题:首先,我通过从 Expose 实体中删除属性 mappedBy = "expose" 来克服第一个问题,即 Expose 实体现在看起来像:
@Entity
@Table(name ="expose")
@Access(AccessType.FIELD)
public class Expose implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name = "id", updatable=false, nullable=false)
private int id;
@OneToOne (fetch = FetchType.EAGER, cascade=CascadeType.PERSIST )
@JoinColumn(name = "home_id")
private Home home;
@ManyToOne ( optional = false, cascade=CascadeType.MERGE )
@JoinColumn(name = "contact_id")
private Contact contact;
}
现在我不再面临第一个问题了。但是,当保存主实体时,它不再引用相应的公开实体。相反,SQL 表 home 中的字段 expose_id 为空。:
这是我保存实体的源代码:
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void saveEntity(Home home) throws EntityExistsException {
Expose expose = null;
if (home.getExpose() != null && home.getExpose().getContact() != null) {
Contact contact = this.em.merge(home.getExpose().getContact());
home.getExpose().setContact(contact);
expose = this.em.merge(home.getExpose());
home.setExpose(expose);
}
this.em.persist(home);
if (expose != null) {
expose.setHome(home);
expose = this.em.merge(expose);
home.setExpose(expose);
this.em.merge(home);
}
}
具有对应暴露实体的主实体被保存而不引用对应的暴露实体,即主表中的expose_id列为空。但是,相应的暴露实体与对主实体的引用一起保存,即暴露表中的列 home_id 正确地引用了主表中的相应行。