将spring @Component
和JPA @Entity
中的注释放在同一个类上是错误的想法。为什么需要在JSF页面上使用这个类,它还描述了表结构。原因是避免将Entity对象映射到将作为表示层的某个值对象。
这是一些反模式吗?你有更好的解决方案吗?
答案 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
答案 2 :(得分:-1)
你应该知道弹簧注释Permissions
默认具有单一范围,实体没有这个范围它完全错误。
使用:
@Component
或在您的实体中:
private Entity entity;
@PostConstruct
public void init() {
entity = new Entity();
}
在你的jsf spring bean中:
@Entity
@Table
@Component
@Scope("request")