Ja, natürlich können Sie. Sie müssen nur sicherstellen, dass die Entität auch als eine Spring-verwaltete Bean entweder deklarativ unter Verwendung von <bean>
Tags (in einigen spring-context.xml) oder durch Anmerkungen wie unten angezeigt wird.
Mithilfe von Anmerkungen können Sie entweder Ihre Entitäten mit @Component
markieren (oder einen spezifischeren Stereotyp @Repository
, der eine automatische Ausnahmeübersetzung für DAOs ermöglicht und möglicherweise JPA beeinträchtigt).
@Entity
@Component
public class MyJAPEntity {
@Autowired
@Transient
ServletContext servletContext;
...
}
Sobald Sie das für Ihre Entitäten Sie ihr Paket (oder ein Vorfahre Paket) konfigurieren müssen getan haben für von Spring gescannt werden, so dass die Einheiten sich wie Bohnen und deren Abhängigkeiten verdrahtet bekommen Auto abgeholt bekommen.
<beans ... xmlns:context="..." >
...
<context:component-scan base-package="pkg.of.your.jpa.entities" />
<beans>
EDIT: (was schließlich arbeitete und warum)
Da ist JPA eine separate Einheit Instanz das heißt nicht mit der Spring-Bean verwaltet, ist es für den Kontext erforderlich geteilt werden.
Dieser feuert init()
, sobald das Entity instanziiert wurde und durch ServletContext
innen Referenzierung zwingt sie die Injektion auf der statischen Eigenschaft, wenn nicht bereits injiziert.
Verschieben @Autowired
zu einer Instanz Methode, aber die statische Feld innerhalb Einstellung.
@Autowired
public void setServletContext(ServletContext servletContext) {
MyJPAEntity.servletContext = servletContext;
}
Zitiert meinen letzten Kommentar unten zu beantworten, warum müssen wir diese Spielereien beschäftigen:
Es gibt keine hübsche Weise zu tun, was Sie wollen, da JPA nicht die Federbehälter nicht verwendet um seine Entitäten zu instantiieren. Stellen Sie sich JPA als einen separaten ORM-Container vor, der den Lebenszyklus von Entitäten instanziiert und verwaltet (vollständig getrennt von Spring) und DI ausschließlich auf Entitätsbeziehungen basiert.
Ich hatte auch die gleiche Art von Problem beim injizieren EntityManager in einen EntityListener und fand eine Lösung und habe es auf einem anderen Beitrag beantwortet http://stackoverflow.com/questions/22171221/how-to-inject-entitymanager-in -entitylisteners/42222592 # 42222592 –