JPA - 使用 EclipseLink 持久化单向一对多关系失败

2022-09-01 15:19:50

我试图坚持一个非常简单的单向一对多关系,但EclipseLink(2.3.1)失败了。

服务类(父级):

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

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="service_id")
    public long serviceID;

    @Column(name="name")
    public String name;

    @OneToMany(cascade={CascadeType.ALL})
    @JoinColumn(name="service_id", referencedColumnName="service_id")
    public Set<Parameter> parameters;
}

参数类(子级):
(当然,数据库中有“service_id”外键字段,该字段在类中没有表示,因为它是单向关系)。

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

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="param_id")
    public long parameterID;

    @Column(name="name")
    public String name;
}

这是实体持久性的代码:

    Service service = new Service();
    service.parameters = new HashSet<Parameter>();
    service.name = "test";
    Parameter param = new Parameter();
    param.name = "test";
    service.parameters.add(param);
    em.persist(service);
    em.flush();

我得到这个例外:

Internal Exception: java.sql.SQLException: Field 'service_id' doesn't have a default value
Error Code: 1364
Call: INSERT INTO tbl_service_parameters2 (name) VALUES (?)
    bind => [test]

编辑:由于数据的性质,数据库字段具有(并且应该具有)非空约束。service_id

这是一个错误还是代码中存在错误?


答案 1

在 上使用 , 上 :nullable = false@JoinColumn

@JoinColumn(name = "service_id", nullable = false)

答案 2

尝试删除参数表的service_id字段上的非空约束。Eclipselink 将在单独的语句中更新单向 1:m 连接列的外键,因此您需要禁用或延迟约束检查。将其设置为双向将允许使用其余参数数据更新 fp 字段。


推荐