播放2.3:具有OneToOne字段的Ebean继承单表

时间:2015-04-16 16:48:22

标签: java inheritance playframework ebean playframework-2.3

我有一个抽象类来表示一种设置。继承类型在一个表中,因为我希望能够访问所有类型的设置,而不管具体类型如何。这是我的父抽象类:

@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对象中,而不是作为单独的实体复制。唯一的缺点是它增加了表的大小。

0 个答案:

没有答案