-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 (如何?!我正在创建新的 Patient,而不是 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

看起来缺少的只是 PoziomDostepu 类上的 @DiscriminatorValue 注释以使用约束中的值之一,否则它默认为类名。PoziomDostepu 的插入来自 this.poziom - 如果您不想插入 PoziomDostepu 实例,您可以使类抽象并确保此实例是子类。您不需要更改继承类型,因为这样做需要将数据库表更改为每个包含相同的字段。

于 2013-01-27T18:32:42.457 回答
0

好的,我已经完成了我想要的。它不优雅,但高效。表和继承策略是一样的。在端点中,我创建帐户和个人实体,然后创建Patient实体,但使用 EntityManager persist()方法。我还需要手动设置级别的 id,((Integer)poziomfacade.getEntityManager().createQuery("SELECT max(p.idpoziom) FROM PoziomDostepu p").getSingleResult())+1因为级别实体类中的生成器不起作用。尽管如此,问题已经解决,感谢每一个建设性的评论或回答。

于 2013-01-28T01:03:17.783 回答