gpt4 book ai didi

java - hibernate 零对一

转载 作者:行者123 更新时间:2023-11-30 05:10:35 25 4
gpt4 key购买 nike

我正在尝试在两个实体之间建立零对一的关系。也就是说,父实体可以在没有关联子实体的情况下保存,也可以与关联子实体一起保存。以下是 2 个实体类...

<小时/>

员工(家长)

public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

@Column(name="EMP_NAME")
private String name;

@PrimaryKeyJoinColumn
@OneToOne(cascade = {CascadeType.ALL})
private EmployeeInfo info;

@Column(name="EMP_ENUM")
private Integer enumId;
<小时/>

员工信息(子级)

public class EmployeeInfo {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;

@Column(name="EMPLOYEE_EMAIL")
private String email;

在 MySql DB 中将唯一父(员工)表设置为自动增量的这种关系和 id 列中,问题是在保存父->子对象图时,我出现以下异常

org.springframework.orm.hibernate3.HibernateJdbcException: JDBC exception on Hibernate data access: SQLException for SQL [insert into EMP_INFO 
Caused by: java.sql.SQLException: Field 'id' doesn't have a default value

我尝试在数据库中将子表的Id属性设置为AUTO INCRMENT,并且这样的Parent->Child对象图的持久化是成功的。然而问题描述here表面,因为我有一个场景,我想在没有关联的 EmpInfo 对象的情况下保存父(Employee)对象,并且因此不希望在 Child 的 id 列上具有自动增量。。 p><小时/>

一种解决方案可能是不使用 PrimaryKeyJoinColumn,而是使用特定的 JoinColumn,但这会向我现有的表添加不必要的列。

<小时/>

有人遇到过这样的问题吗?如果是的话,任何指示都会很有帮助。

最佳答案

最后,感谢 Pascal 和我的一些谷歌搜索,我终于让它工作了。显然,我无法将 native key 生成器用于父级可以在没有子级的情况下存在的关系(可选= true)。最终起作用的事情如下,给我留下了必须处理 Hibernate 特定注释 (@GenericGenerator) 的缺点,并且还必须使用双向关系而不是我想要的单向关系。

Employee (Parent) class remains unchanged as above. It has AUTO INCREMENT on the Id column.

对于子类 (EmployeeInfo),它更改为以下内容,并且再次没有在 Id 列上设置自动增量。

@Table(name="EMP_INFO")
@Entity
public class EmployeeInfo {
@Id
@GeneratedValue(generator="foreign")
@GenericGenerator(name="foreign", strategy = "foreign", parameters={
@Parameter(name="property", value="verifInfo")})
private Long id;

@OneToOne(optional=false)
@JoinColumn (name="id")
private Employee emp;

@Column(name="EMPLOYEE_EMAIL")
private String email;

这帮助我实现了我想要的,但缺点是,GenericGenerator 不是 JPA 注释,它是 hibernate 注释,遗憾的是我现在必须凑合使用它,因为 JPA 目前不支持此(或任何类似)注释。

无论如何,它有助于解决此类情况:-)

关于java - hibernate 零对一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3503019/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com