在同一个类上注释Entity和Component是不对的

时间:2013-08-25 07:38:53

标签: java spring hibernate jsf jpa

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

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

3 个答案:

答案 0 :(得分:6)

  

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

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


  

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

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

E.g。

@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}" />

请参阅,无需复制控制器中的所有实体属性。

另见:

答案 1 :(得分:1)

  

由于JPA没有使用,所以没有办法做你想做的事   Spring容器实例化其实体。把JPA想象成一个   单独的ORM容器,用于实例化和管理生命周期   实体(完全独立于Spring)并基于实体进行DI   只有关系。   Ravi Thapliyal

Bean injection inside a JPA @Entity

答案 2 :(得分:-1)

你应该知道弹簧注释Permissions默认具有单一范围,实体没有这个范围它完全错误。
使用:

@Component

或在您的实体中:

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

在你的jsf spring bean中:

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