-1

ビッグアップデート:

わかりました、私の問題は私が思っていたよりもはるかに複雑です。次のようなテーブルがあります。

Patient:
id
bloodtype
level (FK to level table)
doctor (FK to doctor table)
person (FK to person table)

Doctor:
id
person (FK)
speciality
level (FK to level)

Paramedic:
id
person (FK)

Person:
id
name
surname

Account:
id
login
pass

Level:
id
account (FK)
name (one of: 'patient' , 'paramedic' , 'doctor')

エンティティクラスでは@Inheritance(strategy= InheritanceType.JOINED) @DiscriminatorColumn(discriminatorType=DiscriminatorType.STRING,name="name")、クラスLevelで現在使用しています。誰かが元にいるかどうかを確認するには。患者 私は機能を持っています:

public boolean ifPatient(String login) {
    account = accountfacade.getByLogin(login);
    for (Level l : account.getLevelCollection()) {
        if (l instanceof Patient) {
            return true;
        }
    }
    return false;
}

今、状況があります: 私は医師としてログインしています。患者を追加したい。私はこのようなものを持っています:

public Doctor findDoctor(String login) {
        account = accountfacade.getByLogin(login);
        for (Doctor d : doctorfacade.findAll()) {
            if (d.getLevel().getAccount().getLogin().equals(login)) {
                doctor = d;
                return doctor;
            }
        }
    }
@Override
    public void addPatient(Account acc, Patient pat, Person per, String login) {
    Doctor d = findDoctor(login);
    accountfacade.create(acc);
    personfacade.create(per);
    Patient p = new Patient();
    p.setAccount(acc);
    p.setBlood(pat.getBlood());
// etc
    p.setPerson(per);
    d.getPatientCollection().add(p);
    acc.getLevelCollection().add(p);
    }

しかし、うまくいきません。Account テーブルの主キーの重複値 (しかし、私はTableGenerator... を使用します) や、フィールド Account の NULL 値など、常に完全に奇妙なエラーが発生しますが、INSERT INTO Doctor の場合 (どのように?! 新しい患者を作成していますが、医師ではありません...)。私は今完全に迷っているので、私にとって最も重要なことはInheritanceType.JOINED、この場合に実際に使用できるかどうかを知ることです.

4

3 に答える 3

1

アップデート:

フィールドnazwaを識別子として使用しています

@DiscriminatorColumn(discriminatorType=DiscriminatorType.STRING,name="nazwa")

フレームワークは、オブジェクトを逆シリアル化するために使用する必要があるクラスの名前をそこに格納します (これはPoziomDostepuクラスの名前です)。

私が見る限り、クラスごとに異なるテーブルを使用しているため、Strategy.JOINEDほとんど意味がありません。

より多くの更新:

私が言ったところclassでそれは意味しentityます。エンティティ名を変更して (「CacaCuloPedoPis」など)、PoziomDostepu挿入される新しい値を確認することで、効果を確認できます。

于 2013-01-27T17:30:13.910 に答える
0

わかりました、私はやりたいことをしました。エレガントではありませんが、効率的です。テーブルと継承戦略は同じです。エンドポイントでアカウントと個人エンティティを作成し、次に患者エンティティを作成しますが、EntityManager persist()メソッドを使用します。Level((Integer)poziomfacade.getEntityManager().createQuery("SELECT max(p.idpoziom) FROM PoziomDostepu p").getSingleResult())+1エンティティ クラスのGenerator が機能しないため、手動でレベルの ID を設定する必要もあります。それにもかかわらず、問題は解決されました。建設的なコメントや回答に感謝します。

于 2013-01-28T01:03:17.783 に答える
0

不足しているのは、PoziomDostepu クラスの @DiscriminatorValue アノテーションだけで、制約内の値の 1 つを使用するように見えます。それ以外の場合は、デフォルトでクラス名になります。PoziomDostepu の挿入は this.poziom から来ています - PoziomDostepu インスタンスを挿入したくない場合は、クラスを抽象化し、代わりにこのインスタンスがサブクラスであることを確認してください。継承タイプを変更する必要はありません。変更すると、データベース テーブルをそれぞれ同じフィールドが含まれるように変更する必要があります。

于 2013-01-27T18:32:42.457 に答える