【发布时间】:2012-09-27 03:34:06
【问题描述】:
我正在尝试保持一个非常简单的单向一对多关系,但 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 具有(并且应该具有)非空约束。
这是一个错误还是代码中有问题?
【问题讨论】:
-
奇怪。您是否尝试过更新版本的 EclipseLink? 2.3.3 也许?也许这是一个错误。
-
@TimBedner 在 2.3.3 和 2.4.0 上也进行了测试,但没有运气。我在EclipseLink Bugzilla开了一个案例@
-
您的代码看起来还不错。您想尝试使用 Batoo JPA 吗?如果失败,我可能会提供帮助。 batoo.jp
-
我已将第一个社区测试用例添加到 Batoo JPA :) 你的案例通过了...github.com/BatooOrg/BatooJPA/tree/master/community/src/test/…
-
我建议将映射关系移动到Parameter类。 @ManyToOne(cascade={CascadeType.ALL}) @JoinColumn(name="service_id", referencedColumnName="service_id") 私有Service服务;
标签: java jpa orm eclipselink