9

@Component将 spring和 JPA的注释@Entity放在同一个类上是错误的想法吗?为什么需要在JSF页面上使用这个类,它还描述了表结构。原因是避免将实体对象映射到将成为表示层的某个值对象。

这是一些反模式吗?你有更好的解决方案吗?

4

3 回答 3

8

将来自 spring @Component 和 JPA @Entity 的注释放在同一个类上是否是错误的想法。

这是控制器和模型的紧密耦合。


为什么需要在JSF页面上使用这个类,它还描述了表结构。原因是避免将实体对象映射到将成为表示层的某个值对象。

你把事情复杂化了。您不需要将它映射到一个全新的值对象类左右,您只需将实体设为控制器的属性即可。

例如

@Component // Or CDI @Named or JSF @ManagedBean
public class Controller {

    private Entity entity;

    @AutoWired // Or CDI @Inject or JSF @EJB
    private EntityService service;

    @PostConstruct
    public void init() {
        entity = new Entity(); // In case "new entry" is required.
    }

    public void save() {
        service.save(entity);
    }

    public Entity getEntity() { // No setter required.
        return entity;
    }

}

并在 JSF 组件中按如下方式引用它:

<h:inputText value="#{controller.entity.name}" />
<h:inputText value="#{controller.entity.value}" />
<h:inputText value="#{controller.entity.something}" />
...
<h:commandButton value="save" action="#{controller.save}" />

看,不需要在控制器中复制所有实体的属性。

也可以看看:

于 2013-08-25T11:30:39.860 回答
1

由于 JPA 不使用 Spring 容器来实例化其实体,因此没有什么好方法可以做您想做的事。将 JPA 视为一个单独的 ORM 容器,它实例化和管理实体的生命周期(完全独立于 Spring),并且仅基于实体关系进行 DI。拉维·塔普利亚尔

JPA @Entity 中的 Bean 注入

于 2013-08-25T08:41:28.017 回答
-1

您应该知道@Component默认情况下 spring 注释具有单例范围,并且实体不应该具有完全错误的范围。
利用:

private Entity entity;
@PostConstruct
    public void init() {
        entity = new Entity(); 
}

或在您的实体中:

@Entity
@Table
@Component
@Scope("request")

在你的 jsf spring bean 中:

@Autowired
private Entity entity;
//... getters and setters
于 2015-12-21T13:47:38.633 回答