2016-12-04 20 views
0

子の外部キーをOneToMany双方向関係の親に設定することはできません。 I親クラス連合(EU)はこのように定義している:することができますようにJPA子エンティティのNull親外部キー

@Test 
public void Test() throws Exception { 
    ServiceCharge charge1 = new ServiceCharge(60,"service for employee","27/11/2016 20:35:00"); 
    Union u = new Union("Sindacate", 80); 
    UnionController.add(u); 
    ServiceController.add(charge1, u); 
} 

:その後、私はテストコードを実行

@Entity 
@Table 
public class ServiceCharge implements Serializable{ 


@Id @GeneratedValue(strategy= GenerationType.AUTO) 
int ChargeID; 
String Service; 
@Temporal(TemporalType.TIMESTAMP) 
Calendar TimeStamp; 
float ChargeAmount; 
@ManyToOne 
@JoinColumn(name="union_id") 
Union union; 

public ServiceCharge(){super();} 




public ServiceCharge(float chargeAmount, String service, String timestamp/*, Union union*/) throws ParseException { 
    super(); 
    ChargeAmount = chargeAmount; 
    Service = service; 
    TimeStamp = TimeManagUtil.getGCobjectfromString(timestamp); 
    //this.Union = union; 
} 

// getters and setters 
} 

@Entity 
@PrimaryKeyJoinColumn(referencedColumnName="id") 
@Table(name="union_tb") 
@Inheritance(strategy = InheritanceType.JOINED)  
public class Union extends User{ 

@Column(unique=true) 
String Name; 
float uniondue = 0; 


@OneToMany(targetEntity=ServiceCharge.class,cascade=CascadeType.REMOVE, orphanRemoval=true,fetch = FetchType.EAGER,mappedBy="union") 
List<ServiceCharge> ServiceCharges; 
@OneToMany(targetEntity=Employee.class,cascade=CascadeType.REMOVE, orphanRemoval=true,fetch = FetchType.EAGER) 
List<Employee> Employee; 

public void PostServiceCharge(ServiceCharge charge) { 
    ServiceCharges.add(charge); 

} 

そしてServiceChargeがこのように定義された子クラスを参照してください、私は2つのエンティティをデータベースに結合した後に2つのエンティティを関連付けています.ServiceController.addは、エンティティcharge1をUnionセッタを使用してサービス料金のリストに追加します。エンティティをデータベースに追加します。

しかし、テストは正常になります、しかし、私はこれだけを見ることができます:

| ChargeID | ChargeAmount | Service    | TimeStamp   | union_id | 
+----------+--------------+----------------------+---------------------+----------+ 
|  6 |   60 | service for employee | 2016-11-27 20:35:00 |  NULL | 
|  7 |   10 | service for employee | 2016-11-27 20:45:00 |  NULL 


| Name  | uniondue | id | 
+-----------+----------+----+ 
| Sindacate |  80 | 5 | 
+-----------+----------+----+ 

あなたが見ることができるように、union_idがnullに設定されています。何が間違っているのですか?

答えて

0

最初にUnionクラスをインスタンス化し、ServiceChargeのコンストラクタで初期化してください。

@Test 
public void Test() throws Exception { 
    Union u = new Union("Sindacate", 80); 
    UnionController.add(u); 
    ServiceCharge charge1 = 
       new ServiceCharge(60,"service for employee","27/11/2016 20:35:00", u); // uncomment your parameter here that accepts Union class type. 
    ServiceController.add(charge1, u); 
} 
+0

あなたは私を救った。実際には、サービスチャージは関連する連合なしでは存在できないため、概念的には正しいです。しかし、今、私は従業員の関係で同じ問題がありますが、現在はNULLにすることもできますし、毎回パラメータとしてNULLを渡すというアイデアが好きではないので、今ではUnionをコンストラクタに呼び出すべきではありません。 – Andrew

+0

これまでの出力は何ですか?私はあなたが使用するコンストラクタを選択できるように、コンストラクタをオーバーロードすることができると思います。だからあなたはオプションを持つことができます。 Unionパラメータを持つコンストラクタと、Unionパラメータを持たないコンストラクタです。 – msagala25

+0

従業員は、後で組合に関連付けられるようにインスタンス化された後に決定できるので、私はそのようには行くことができません。ヌル値は許可されます。 – Andrew

関連する問題