You should have a look at Spring Roo. They have something simular (no DAOs or Services), but there EntityManager is not static.
They do the trick with the @Configurable
annotation in Entities:
@Entiy
@Configurable
class MyEntity() {
@PersistenceContext
transient EntityManager Car.entityManager;
...
public static MyEntity findMyEntityById(Long id) {
if (id == null) return null;
return entityManager().find(MyEntity.class, id);
}
public static EntityManager entityManager() {
EntityManager em = new MyEntity().entityManager;
if (em == null) throw new IllegalStateException("Entity manager has not been injected (is the Spring Aspects JAR configured as an AJC/AJDT aspects library?)");
return em;
}
}
Anyway it has two or three drawbacks:
But it has also some nice effects: for example the persist and delete methods become very natural, they are just member of the entity:
@Transactional
public void persist() {
if (this.entityManager == null) this.entityManager = entityManager();
this.entityManager.persist(this);
}
To make a none Roo project aviable for @Configurable
you need to at LEAST doing this:
extend the pom.xml:
<properties>
<spring.version>3.0.5.RELEASE</spring.version>
<aspectj.version>1.6.11</aspectj.version>
<aspectj-maven-plugin.version>1.2</aspectj-maven-plugin.version>
<maven-compiler-plugin.version>2.3.2</maven-compiler-plugin.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
...
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspectj.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${aspectj.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
...
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>${aspectj-maven-plugin.version}</version>
<!-- NB: do use 1.3 or 1.3.x due to MASPECTJ-90 - wait for 1.4 -->
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspectj.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>${aspectj.version}</version>
</dependency>
<!--
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-aspects</artifactId>
<version>3.0.5.RELEASE</version>
</dependency>
-->
</dependencies>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
<configuration>
<outxml>true</outxml>
<aspectLibraries>
<aspectLibrary>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</aspectLibrary>
<!--
<aspectLibrary>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-aspects</artifactId>
</aspectLibrary>
-->
</aspectLibraries>
<source>1.6</source>
<target>1.6</target>
<encoding>utf-8</encoding>
</configuration>
</plugin>
Spring config:
<!-- Turn on AspectJ @Configurable support. As a result, any time you instantiate an object,
Spring will attempt to perform dependency injection on that object.
This occurs for instantiation via the "new" keyword, as well as via reflection.
This is possible because AspectJ is used to "weave" Roo-based applications at compile time.
In effect this feature allows dependency injection of any object at all in your system,
which is a very useful feature (without @Configurable you'd only be able to
dependency inject objects acquired from Spring or subsequently presented to
a specific Spring dependency injection method). -->
<context:spring-configured />
<tx:annotation-driven mode="aspectj" transaction-manager="transactionManager" />
<!--
Spring Security:
requires version 3.0.4 of Spring Security XSD: spring-security-3.0.4.xsd
<global-method-security ... mode="aspectj">
-->