【问题标题】:OneToOne mapping JPA - Cascade.All not copying the id columnOneToOne 映射 JPA - Cascade.All 不复制 id 列
【发布时间】:2021-01-01 15:47:43
【问题描述】:

我尝试搜索此特定问题,但无法获得任何帮助

在创建员工时 --> 应该创建帐户。

我的实体是 --> 员工实体

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

    private static final long serialVersionUID = -1798070786993154676L;


    @Id
    @Column(name = "EMPLOYEE_id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int EMPLOYEE_id;

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

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

    
  
    @OneToOne(cascade=CascadeType.ALL)
    @JoinColumn(name = "EMPLOYEE_id")
    @MapsId
    private ACCOUNT account;


    // getters and setters 
}

账户实体-->

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

    private static final long serialVersionUID = -6790693372846798580L;



    @OneToOne( fetch = FetchType.LAZY)
    @JoinColumn(name = "EMPLOYEE_id")
    private EMPLOYEE employee

    @Id
    @Column(name = "account_id")
    private int account_id;

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




 // getters setters 
}

在创建员工时 --> 应该创建帐户。

我的 pojo 被正确映射,如下所示 -->

 employee = { EMPLOYEE_id = 0 ,
        EMPLOYEE_name = 'abc' ,
        EMPLOYEE_desc = 'new employee' ,
        account = { account_id = 1 ,
                    account_desc = 'my account' ,
                    EMPLOYEE_id = 0  }
        }

所以当我使用相同的员工对象时 - 它会生成 employee_id ,但相同的employee_id 不会填充到帐户表中

它部分工作 --> Account 表中的 Employee_id 没有被填充。

我尝试在 stackOverflw 上搜索很多问题 - 但到目前为止没有运气。 任何帮助表示赞赏。

提前谢谢你

【问题讨论】:

  • 你在代码中的任何地方都使用ACCOUNT.setEmployee(employee) 吗?
  • 请提供有关您如何构造 EmployeeAccount 对象并保存它的信息。
  • 添加了有关填充我的员工对象的更多信息

标签: java hibernate jpa hibernate-annotations


【解决方案1】:

如果在关系的两边都定义了@OneToOne,那么一方应该是所有者。那是具有外键的实体。另一边应该有 mappedBy 属性。所以以下对我有用

@Entity
@Table(name = "EMPLOYEE")
public class EMPLOYEE implements Serializable {
  @OneToOne(cascade= CascadeType.ALL, mappedBy = "employee") // non-owner side
  private Account account;
  ....
}

@Entity
@Table(name = "ACCOUNT")
public class Account implements Serializable {
  @OneToOne( fetch = FetchType.LAZY)
  @JoinColumn(name = "EMPLOYEE_id") // owner-side
  private Employee employee;
}

【讨论】:

  • 嗨,Rasha,谢谢你的回答,但这对我不起作用,在创建员工时,我的员工是所有者,应该创建帐户,
  • 我尝试了以下方法并且成功了:
    Employee e = new Employee();帐户 a = new Account(); e.setAccount(a); a.setEmployee(e); entityManager.persist(e);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-02
  • 2014-05-17
  • 2021-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-05
相关资源
最近更新 更多