非常に単純な単方向の1対多の関係を維持しようとしていますが、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
には、データの性質上、null以外の制約があります(また、そうする必要があります)。
これはバグですか、それともコードに何か問題がありますか?