私はバンキング アプリケーションを実装しており、データベースに 3 つのテーブル (User、Account、AccountActivity) があります。
Account
およびクラスの実装は次のAccountActivity
ようになります。
@MappedSuperclass public abstract class AbstractDomain implements Serializable {
@Id @GeneratedValue
private long id = NEW_ID;
public static long NEW_ID = -1;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public boolean isNew() {
return id==NEW_ID;
}
}
@Table(name="ACCOUNT_ACTIVITY")
@Entity
public class AccountActivity extends AbstractDomain {
@Column(name="NAME")
private String Name;
@Column(name="XDATE")
private Date Date;
@Column(name="VALUE")
private double Value;
@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="ACCOUNTID")
private Account ACCOUNT;
@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="OTHERACCOUNTID")
private Account OTHERACCOUNT;
public String getName() {
return Name;
}
// ...
}
と:
@Table(name="ACCOUNT")
@Entity
public class Account extends AbstractDomain {
@Column(name="NAME")
private String Name;
@Column(name="XDATE")
private Date Date;
@Column(name="VALUE")
private double Value;
@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="USERID")
private User USER;
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)
private List<AccountActivity> AccountActivity = new ArrayList<AccountActivity>();
// ...
}
新しいアカウントをデータベースに保存するには、次を使用します。
public Account storeAccount(Account ac) {
User x = ac.getUser();
x = em.merge(x);
ac = em.merge(ac);
return ac;
}
これは、新しいアカウントをデータベースに保存するだけです。アカウント アクティビティ情報が既に保存されているアカウントに追加されると、そのアカウントが更新され、追加された情報 (アカウント アクティビティ) が次のコードを使用して AccountActivity テーブルにカスケードされる機能を実装したいと考えました。
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)
private List<AccountActivity> AccountActivity = new ArrayList<AccountActivity>();
このコードをテストすると、次のエラーが表示されます。
java.sql.SQLException: 整合性制約違反 - 親がありません FK670B7D019607336A テーブル: ステートメントの ACCOUNT_ACTIVITY
誰でもこの問題で私を助けることができますか?
アップデート
このjunitコードでテストします:
public void testAddAccountActivities() {
User user = dummyPersistedUser();
User user2 = dummyPersistedUser();
Account account = getTestUtils().dummyEmptyAccount(user);
Account account2 = getTestUtils().dummyEmptyAccount(user2);
account=accountManager.storeAccount(account);
account2=accountManager.storeAccount(account2);
getTestUtils().fillAccounts(account, account2);
accountManager.storeAccount(account);
accountManager.storeAccount(account2);
assertEquals(2,accountManager.getAccount4Name(account.getName()).getAccountActivity().size());
assertEquals(2,accountManager.getAccount4Name(account2.getName()).getAccountActivity().size());
}
グラフに追加する必要がfillAccounts(account, account2)
あるいくつかの AccountActivities を挿入するだけです。
AccountActivity aa = new AccountActivity();
aa.setDate(new Date());
aa.setName("test activity");
aa.setAccount(a1);
aa.setValue(value);
aa.setOtherAccount(a2);
account.addAccountActivity(aa)