【发布时间】:2020-01-05 03:44:50
【问题描述】:
我使用的是 Hibernate 4.3.6.Final 和 WildFly 16。@OneToOne 关系存在两个问题。
1.) 第一个问题:Unknown mappedBy in: at.home.digest.model.Expose.home,引用属性未知: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);
}
}
具有相应公开实体的 Home 实体在不引用相应公开实体的情况下被保存,即 home 表中的 Expose_id 列为空。但是,相应的暴露实体与对主实体的引用一起保存,即暴露表中的列 home_id 正确地引用了主表中的相应行。
【问题讨论】:
-
您是否尝试过在
Home实体中不使用mappedBy? -
@ConstantinBeer 是的,请看我上面的源代码
-
我不是指
Expose中的mappedBy。我的意思是在您的Home实体中,mappedBy="home"。 -
@ConstantinBeer 在我的 Home 实体中,我有 fetch = FetchType.LAZY, mappedBy = "home", cascade = CascadeType.ALL
-
@ConstantinBeer 谢谢!我会检查并告诉你。亲切的问候:亚历克斯
标签: hibernate cascade one-to-one bidirectional-relation hibernate-cascade