0

私はバンキング アプリケーションを実装しており、データベースに 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)
4

2 に答える 2

0
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)
@JoinColumn(name ="accountid") // you have several references from AccountActivity to Account. You need to specify the join column in this case.
private List<AccountActivity> AccountActivity = new ArrayList<AccountActivity>();
于 2012-12-04T20:52:59.857 に答える
-1

最初の観察として、変数名をクラスと同じにするべきではないと思います。したがって、このプライベートリスト<AccountActivity> AccountActivityの代わりに、プライベートリスト<AccountActivity>accountActivityのようなものを書くことができます。

于 2012-12-04T19:21:26.683 に答える