当保存Hibernate JPA实体后,外键为空的问题可能是由于以下几个原因造成的:
下面是一个示例代码,演示了如何解决这个问题:
import javax.persistence.*;
@Entity
@Table(name = "parent")
public class ParentEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
// 定义与子实体的关联关系
@OneToOne(mappedBy = "parent", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private ChildEntity child;
// getter和setter方法
}
@Entity
@Table(name = "child")
public class ChildEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
// 定义与父实体的关联关系
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "parent_id")
private ParentEntity parent;
// getter和setter方法
}
public class Main {
public static void main(String[] args) {
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("example");
EntityManager entityManager = entityManagerFactory.createEntityManager();
try {
entityManager.getTransaction().begin();
ParentEntity parent = new ParentEntity();
ChildEntity child = new ChildEntity();
// 建立父实体与子实体的关联
parent.setChild(child);
child.setParent(parent);
// 保存父实体
entityManager.persist(parent);
entityManager.getTransaction().commit();
} catch (Exception e) {
entityManager.getTransaction().rollback();
} finally {
entityManager.close();
entityManagerFactory.close();
}
}
}
在上面的示例中,我们定义了一个父实体ParentEntity
和一个子实体ChildEntity
,它们之间是一对一的关系。在保存父实体之前,我们通过parent.setChild(child)
和child.setParent(parent)
方法建立了它们之间的关联关系。然后,我们调用entityManager.persist(parent)
保存父实体。在保存父实体的同时,也会自动保存与之关联的子实体,并将外键值设置为正确的值。
需要注意的是,在@OneToOne
注解中,通过mappedBy
属性指定了子实体ChildEntity
关联到父实体ParentEntity
的属性名。而在@JoinColumn
注解中,通过name
属性指定了外键列的名称为parent_id
。
通过以上代码,我们可以确保在保存Hibernate JPA实体后,外键不会为空。