我有一个抽象类来表示一种设置。继承类型在一个表中,因为我希望能够访问所有类型的设置,而不管具体类型如何。这是我的父抽象类:
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(discriminatorType = DiscriminatorType.STRING)
public abstract class Settings extends Model {
@Id
public Long settingId;
public static Model.Finder<Long, Settings> find = new Model.Finder<>(Long.class, Settings.class);
public abstract void run();
}
这是我的具体类型之一:
@Entity
@DiscriminatorValue("text")
public class TextSettings extends Settings {
public boolean type;
@OneToOne(cascade = CascadeType.ALL)
public EmailFields emailFields;
public static Finder<Long, TextSettings> find = new Finder<>(Long.class, TextSettings.class);
public static TextSettings get() {
if (find.all().size() > 0)
return find.all().get(0);
else {
TextSettings settings = new TextSettings();
settings.emailFields = new EmailFields();
settings.emailFields.test = "Test"; \\this field is null if you try to get this field with a get on the TextSettings ebean object
settings.save();
return settings;
}
}
}
这个具体类型实际上包含另一个具有OneToOne
关系的ebean模型。以下是该模型的代码:
@Entity
@DiscriminatorValue("email")
public class EmailFields extends Model {
@Id
public Long id;
public String test;
public static Finder<Long, EmailFields> find = new Finder<>(Long.class, EmailFields.class);
}
当我尝试通过EmailFields
模型获取TextSettings
模型时,我得到了正确的id,并且该对象存在于数据库中,但字段test
为空。我添加到它的任何字段始终为空。
这种类型的设置在非继承ebean模型中适用于我,因此我只能认为它与单个表有关。有没有人知道这方面的解决方案,还是我必须将test
字段复制到TextSettings
模型中?
注意:我已经简化了代码,因此逻辑上可能没有意义为什么我在EmailFields
中有一个字段,但我的假设是我确实需要它作为一个单独的模型,因为一些设置将具有此模型有些人不会。所以我不想在这些设置的类中使用样板代码。
更新
所以现在我使用@Embedded
和@Embeddable
注释。
@Embeddable
public class EmailFields extends Model
并在TextSettings
@Embedded
public EmailFields emailFields;
这只是将EmailFields
'字段复制到TextSettings
对象中,而不是作为单独的实体复制。唯一的缺点是它增加了表的大小。