【问题标题】:Use of @EmbeddedId and @MapsId causes NULL inserted (NOT NULL constraint violation)使用 @EmbeddedId 和 @MapsId 会导致 NULL 插入(NOT NULL 约束违规)
【发布时间】:2017-12-27 22:33:35
【问题描述】:

使用以下代码

@Embeddable
public class EmployeeId implements Serializable {
    @Column(name = "company_id")
    private Long companyId;

    @Column(name = "employee_id")
    private Long employeeNumber;
}

@Entity
public class Employee {
    @EmbeddedId
    private EmployeeId id;

    private String name;

    @MapsId("name=companyId")
    @ManyToOne
    @JoinColumn(name = "company_id")
    private Company company;
}

当尝试持久化或合并 Employee 实体时,我们可以看到 NULL 被尝试插入到 company_id 字段中。

如何避免插入NULL

【问题讨论】:

    标签: java jpa


    【解决方案1】:

    即使有连线,当创建一个新对象(不是从持久性上下文中获取)时,company 字段仍将保持为null

    创建新的Employee 实体时,您需要确保还初始化了company 属性:

    @Entity
    public class Employee {
        @EmbeddedId
        private EmployeeId id;
    
        private String name;
    
        @MapsId("name=companyId")
        @ManyToOne
        @JoinColumn(name = "company_id")
        private Company company;
    
        public Employee() {}
    
        public Employee(int id,String name,Company company) {
          this.name = name;
          this.id = new EmployeeId(id,company.id);
          this.company = company;
        }
    }
    

    您可以使用find 从持久性上下文中获取Company 实体。您也可以使用它的构造函数从头开始创建它。

    【讨论】:

      猜你喜欢
      • 2017-03-01
      • 2020-01-28
      • 2019-07-27
      • 2015-11-01
      • 2018-12-22
      • 2020-10-02
      • 2014-11-27
      • 2018-03-20
      • 1970-01-01
      相关资源
      最近更新 更多