@Component
将 spring和 JPA的注释@Entity
放在同一个类上是错误的想法吗?为什么需要在JSF页面上使用这个类,它还描述了表结构。原因是避免将实体对象映射到将成为表示层的某个值对象。
这是一些反模式吗?你有更好的解决方案吗?
将来自 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}" />
看,不需要在控制器中复制所有实体的属性。
由于 JPA 不使用 Spring 容器来实例化其实体,因此没有什么好方法可以做您想做的事。将 JPA 视为一个单独的 ORM 容器,它实例化和管理实体的生命周期(完全独立于 Spring),并且仅基于实体关系进行 DI。拉维·塔普利亚尔
您应该知道@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