GAE/J und Spring: Teil 2
Speichern von Daten per JDO
Als erstes werde ich mal die Domainenobjekte anlegen, in diesem Fall erstmal einen User und als 1:N die dazugehörigen WeightUnits, bestehend aus Gewicht/Tag. Außerdem benötigen wir noch die DAOs/Services sowie die PersistenceManagerFactory:
Für die Transaktionen muss noch die spring-tx.jar, spring-aop.jar und aopalliance-1.0.jar zum Classpath zugefügt werden.
Hier der User:
01 | @PersistenceCapable (identityType = IdentityType.APPLICATION) |
02 | public class User implements Serializable |
03 | { |
04 | @PrimaryKey |
05 | @Persistent (valueStrategy = IdGeneratorStrategy.IDENTITY) |
06 | private Key key; |
07 |
08 | @Persistent |
09 | private String j_username; |
10 |
11 | @Persistent |
12 | private String j_password; |
13 |
14 | @Persistent |
15 | private String email; |
16 |
17 | @Persistent |
18 | private BigDecimal weight; |
19 |
20 | @Persistent |
21 | private BigDecimal desiredWeight; |
22 |
23 | @Persistent (mappedBy = "user" ) |
24 | private List<weightunit> weightUnits = Lists.newArrayList(); |
25 |
26 | //getter/setter |
27 | } |
28 | </weightunit> |
Und die WeightUnit:
01 | @PersistenceCapable (identityType = IdentityType.APPLICATION) |
02 | public class WeightUnit |
03 | { |
04 | @PrimaryKey |
05 | @Persistent (valueStrategy = IdGeneratorStrategy.IDENTITY) |
06 | private Key key; |
07 |
08 | @Persistent |
09 | private Date day; |
10 |
11 | @Persistent |
12 | private BigDecimal weight; |
13 |
14 | @Persistent |
15 | private User user; |
16 |
17 | //getter/setter |
18 |
19 | } |
In der application-context.xml wird die PersistenceManagerFactory verdrahtet:
01 | < tx:annotation-driven > |
02 | < bean id = "persistenceManagerFactory" class = "org.springframework.orm.jdo.LocalPersistenceManagerFactoryBean" > |
03 | < property name = "persistenceManagerFactoryName" value = "transactions-optional" > |
04 | </ property > |
05 |
06 | < bean id = "transactionManager" class = "org.springframework.orm.jdo.JdoTransactionManager" > |
07 | < property name = "persistenceManagerFactory" ref = "persistenceManagerFactory" > |
08 | </ property > |
09 |
10 | < bean id = "userDAO" class = "de.pmannel.login.UserDAOImpl" > |
11 | < property name = "persistenceManagerFactory" ref = "persistenceManagerFactory" > |
12 | </ property > |
13 |
14 | < bean id = "userService" class = "de.pmannel.login.UserServiceImpl" > |
15 | < property name = "userDAO" ref = "userDAO" > |
16 | </ property > |
17 | </ bean ></ bean ></ bean ></ bean ></ tx:annotation-driven > |
anschließend benötigen wir die DAOs zum Speichern und Auslesen. Zu jeder DAOImpl gehört natürlich ein Interface, welches ich aus Platzgründen weg lasse:
01 | public class UserDAOImpl extends JdoDaoSupport implements UserDAO |
02 | { |
03 |
04 | @Override |
05 | public void delete(User user) |
06 | { |
07 | // TODO Auto-generated method stub |
08 |
09 | } |
10 |
11 | @Override |
12 | public User findUserById( Key key) |
13 | { |
14 | // TODO Auto-generated method stub |
15 | return null ; |
16 | } |
17 |
18 | @Override |
19 | public User save(User user) |
20 | { |
21 | return getPersistenceManager().makePersistent(user); |
22 | } |
23 |
24 | } |
Ich verwende hier den JdoDaoSupport und binde mich damit an Spring, wer möchte kann sich die Factory auch selber injecten.
Anschließend noch Service/ServiceImpl erzeugen und in einen Controller injecten.
Damit die Session während eines Views nicht geschlossen werden, kommt noch ein OpenPersistenceInViewFilter in die web.xml.
1 | < filter > |
2 | < filter-name >OpenPersistenceManagerInViewFilter</ filter-name > |
3 | < filter-class >org.springframework.orm.jdo.support.OpenPersistenceManagerInViewFilter</ filter-class > |
4 | </ filter > |
5 | < filter-mapping > |
6 | < filter-name >OpenPersistenceManagerInViewFilter</ filter-name > |
7 | < url-pattern >/*</ url-pattern > |
8 | </ filter-mapping > |
Im nächsten Teil versuche ich dann, Spring Security in der Anwendung zum Laufen zu bekommen.