当前位置: 首页 > 面试题库 >

如何更改设计以使实体不使用注入?

蒋烨然
2023-03-14
问题内容

我已经阅读并意识到自己对实体(数据对象-
用于JPA或序列化)的注入是一个坏主意。这是我当前的设计(所有适当的领域都有getter和setter,serialVersionUID为简洁起见,我将其省略)。

这是父对象,它是实体组成图的头部。这是我序列化的对象。

public class State implements Serializable {

    List<AbstractCar> cars = new ArrayList<>();

    List<AbstractPlane> planes = new ArrayList<>();

   // other objects similar to AbstractPlane as shown below
}

AbstractPlane 它的子类只是没有注入的简单类:

public abstract class AbstractPlane implements Serializable {
    long serialNumber;
}

public class PropellorPlane extends AbstractPlane {
    int propellors;
}

public class EnginePlane extends AbstractPlane {
    List<Engine> engines = new ArrayList<>(); // Engine is another pojo
}

// etc.

相比之下,每种具体类型的汽车都需要拥有某种行为和某种特定形式的数据的管理器:

public abstract class AbstractCar implements Serializable {
    long serialNumber;

    abstract CarData getData();

    abstract void operate(int condition);

    abstract class CarData {
        String type;
        int year;
    }
}

public class Car1 extends AbstractCar {

    @Inject
    Car1Manager manager;

    Car1Data data = new Car1Data(); // (getter exists per superclass requirement)

    void operate(int i) { // logic looks weird but makes the example
        if (i < 0)
            return manager.operate(data);
        else if (i > 1)
            return manager.operate(data, i);
    }

    class Car1Data extends CarData {
        int property1;

        {
            type = "car1";
            year = 1;
        }
    }
}

public class Car2 extends AbstractCar {

    @Inject
    Car2Manager manager;

    Car2Data data = new Car2Data();

    void operate(int i) {
        if (i < 31)
            return manager.operate(data);
    }

    class Car2Data extends CarData {
        char property2;

        {
            type = "car2";
            year = 12;
        }
    }
}

// etc.

CarxManager@Stateless,其上的数据(匹配执行操作豆CarxData给它们)。它们本身进一步使用了许多其他bean的注入,它们都是的子类AbstractCarManager。有O(100)个汽车类型和匹配管理器。

序列化时的问题State是,序列化抽象汽车列表与子类中的注入不能很好地配合。我正在寻找一种将注入与数据保存过程脱钩的设计。


问题答案:

一种可能是删除该属性,以便序列化程序不会选择它。可以通过以编程方式获取它来实现。

private Car2Manager getCar2Manager() {
  CDI.current().select(Car2Manager.class).get();
}

我认为这 不是 一个干净的解决方案,但它应该是一个可行的“解决方案”

也可能使用JPA的@Transient

@Inject
@Transient
Car2Manager manager;

我尚未对此进行测试,因此可能无法正常工作。



 类似资料:
  • 我有3个实体- > 课程 组件 时间线课程是一个独立的实体,具有以下属性:课程-(id Integer主键,Course_name) @ Id @ Column(name = " Id ")Integer courseId;@Column(name = "course_name ")字符串course _ name; 接下来是另一个实体模块,模块中的每一行都与一门课程相关,因此模块和课程之间存在一

  • 问题内容: 我正在尝试使用Swift更改UIButton的字体… 但是已弃用,否则我不确定如何更改字体。 有什么建议? 问题答案: 使用代替。该属性在iOS 3.0中已弃用。它在Objective- C中也不起作用。是用于在上显示标题的标签。 但是,在设置标题文本时,您只能使用。请勿用于直接为标题设置任何文本。

  • 我知道类似的问题,但它们是在Hibernate的范围内被问到和回答的。我也有同样的问题,但我正在使用Eclipselink,想知道对于Hibernate,是否有更好的或替代的解决方案。 简单地回顾一下这个问题: 我有两个相互继承的类: 现在我想把一个孩子变成父母,或者反过来。 我希望现在p的数据库行是。 另一种方法是这样的: 在这种情况下,我希望与一起保存,并丢失的值。 然而,上面所描述的并不奏效

  • 我正在尝试使用Querydsl(4.1.4)查询JPA,如本文http://www.Querydsl.com/static/Querydsl/latest/reference/html/ch02.html#jpa_integration所述。我使用Hibernate(5.2.12.final)作为JPA后端。我使用和处理器从JPA注释类生成Querydsl查询类型。 这将打印: 原始JpaUpda

  • 所以我开始了一个个人简历网站,我偶然发现了一个非常酷的东西:font awesome,它以文本的形式提供图形,允许你通过CSS添加字体效果。我的问题是一切都很好,直到我试图改变字体大小,无论什么原因,它就是不会改变。你有什么想法吗?我也是新的这里,我已经阅读通过如何使帖子,但如果我做错了,请让我知道。

  • 问题内容: 这个问题几乎说明了一切。使用JPARepository如何更新实体? JPARepository只有一个 save 方法,它不会告诉我它是否实际上是在创建或更新。例如,我插入一个简单的对象数据库的用户,其中有三个领域:,和: 然后,我简单地调用,这实际上是数据库的插入: 到目前为止,一切都很好。现在,我想更新此用户,例如更改其年龄。为此,我可以使用QueryDSL或NamedQuery