27

非常に単純な単方向の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以外の制約があります(また、そうする必要があります)。

これはバグですか、それともコードに何か問題がありますか?

4

6 に答える 6

38

を使用nullable = falseしてください@JoinColumn

@JoinColumn(name = "service_id", nullable = false)
于 2012-12-26T20:52:46.827 に答える
14

パラメータテーブルのservice_idフィールドの非NULL制約を削除してみてください。Eclipselinkは、別のステートメントで単方向1:m結合列の外部キーを更新するため、制約チェックを無効にするか遅らせる必要があります。双方向にすることで、fpフィールドを残りのパラメーターデータで更新できるようになります。

于 2012-10-06T19:42:31.503 に答える
1

hibernateバージョン<4.0の永続性を変更でき、コードは適切に実行されます。

于 2012-11-20T16:41:18.053 に答える
1

延期可能な外部キーを使用することで、Oracleで動作させることができました。

例:

ALTER TABLE my_table ADD CONSTRAINT my_constraint_name FOREIGN KEY (my_table_column) REFERENCES foreign_key_table  (foreign_key_table_column) DEFERRABLE INITIALLY DEFERRED
于 2013-11-20T16:30:57.663 に答える
1

デフォルトでは、@ JoinColumnではnullableがtrueですが、データを1対多の関係で永続化する一方で、実行時に発生するデータ違反の例外を回避するためにnullableをfalseにする必要があります。

于 2018-07-06T14:13:35.823 に答える
0

私が知ったように、そのような場合、外部キーは別のステートメントに記入されます。私の例では、外部キーとしてAddressエンティティを使用しました。customer_id

2014-07-08T20:51:12.752+0300|FINE: INSERT INTO ADDRESS (address_id, street, city, region) VALUES (?, ?, ?, ?)
    bind => [10, foo, foo, foo]
2014-07-08T20:51:12.753+0300|FINEST: Execute query InsertObjectQuery(ua.test.customer.Address@28cef39d)
2014-07-08T20:51:12.757+0300|FINEST: Execute query DataModifyQuery(sql="UPDATE ADDRESS SET customer_id = ? WHERE (address_id = ?)")
2014-07-08T20:51:12.757+0300|FINE: UPDATE ADDRESS SET customer_id = ? WHERE (address_id = ?)
    bind => [151, 10]

したがって、@JoinColumnwithnullable=trueがあるとエラーが発生します。

別の方法として、を使用できます@OneToMany (..., orphanRemoval = true, ...)

于 2014-07-08T18:02:27.973 に答える