Thursday, December 03, 2009

Import a certificate to keystore.

Import a certificate into default key store 'cacerts'.

keytool -import -trustcacerts -keystore cacerts -alias drssomp0117 -file drss117.2048.crt

Wednesday, December 02, 2009

Java JDK 1.4 JCE Provider issue.

Bundled JCE provider in jdk1.4 can't cope with keys bigger than 2048. If you are working on a websrvice, which needs using https to access, you maybe will be in trouble as commocial certificates most need 4096. In Java 1.5 and higher, it is OK as longer key was supported as default. How to sovle this issue? You have to find an alternative JCE provider that supports key size 4096.

Provider resources:
http://www.bouncycastle.org/java.html
http://www.cryptix.org/

Wednesday, November 25, 2009

Web Services Security for Axis

Web Services Authentication with Axis

Web Services Authentication with Axis 2

What's New in WSDL 2.0

WSDL 1.2 was renamed WSDL 2.0 because of its substantial differences from WSDL 1.1. Some of these changes include:

.Adding further semantics to the description language. This is one of the reasons for making targetNamespace a required attribute of the definitions element in WSDL 2.0.

.Removal of message constructs. These are specified using the XML schema type system in the types element.

.No support for operator overloading.

.PortTypes renamed to interfaces. Support for interface inheritance is achieved by using the extends attribute in the interface element.

.Ports renamed to endpoints.

(From http://www.xml.com/pub/a/ws/2004/05/19/wsdl2.html)

Sunday, November 22, 2009

Getting Started with Java EE 6

Getting Started with Java EE 6

In this tutorial we’ll update you on the world of Java EE 6 with the help of a Twitter-like demo application we’ve code-named wallfriend. The demo application contains JSF 2.0, PrimeFaces, CDI and Weld as well as Hibernate Validator frameworks.

Wednesday, November 11, 2009

Keystore and Truststore Definitions

JSSE introduces the notion of a truststore, which is a database that holds certificates. In fact, a truststore has exactly the same format as a keystore; both are administered with keytool, and both are represented programmatically as instances of the KeyStore class. The difference between a keystore and a truststore is more a matter of function than of programming construct, as we will see.

The server in an SSL conversation must have a private key and a certificate that verifies its identity. The private key is used by the server as part of the key exchange algorithm, and the certificate is sent to the client to tell the client who the server is. This information is obtained from the keystore. Remember that the private key is never sent from the server to the client; it is used only as an input to the key exchange algorithm.

SSL servers can require that the client authenticate itself as well. In that case, the client must have its own keystore with a private key and certificate.

The truststore is used by the client to verify the certificate that is sent by the server. If I set up an SSL server, it will use a certificate from my keystore to vouch for my identity. This certificate is signed by a trusted certificate authority (or, as we've seen, there may be a chain of certificates, the last of which is signed by a recognized CA). When your SSL client receives my certificate, it must verify that certificate, which means that the trusted CA's certificate must be in your local truststore. In general, all SSL clients must have a truststore. If an SSL server requires client authentication, it must also have a truststore.

In sum, keystores are used to provide credentials, while truststores are used to verify credentials. Servers use keystores to obtain the certificates they present to the clients; clients use truststores to obtain root certificates in order to verify the servers' certificates.

The keystore and truststore can be (and often are) the same file. However, it's usually easier to manage keys if they are separate: the truststore can contain the public certificates of trusted CAs and can be shared easily, while the keystore can contain the private key and certificate of the local organization and can be stored in a protected location. In addition, JSSE is easier to use if the keystore contains a single alias. When the keystore contains multiple aliases there are ways to specify which one should be used, but that requires more programming. Keep in mind that in general a keystore containing a single alias makes using JSSE simpler.

A keystore contains private keys, and the certificates with their corresponding public keys. You only need this if you are a server, or if the server requires client authentication.

A truststore contains certificates from other parties that you expect to communicate with, or from Certificate Authorities that you trust to identify other parties. If your server’s certificate is signed by a recognized CA, the default truststore that ships with the JR will already trust it (because it already trusts trustworthy CAs), so you don’t need to build your own, or to add anything to the one from the JRE.

keyStore vs trustStore

Basically they can be a single store or separate.
You will store in Keystore normally your private stuff and have a different store of trusted entries.
The separation is good idea.
The keystore will be used for encrypting/signing some thing with your private key while the trust stores will be used mostly to authenticate remote servers etc.
In java I think to trust any entries you will pass -trustcacerts option.

You always need a truststore that points to a file containing trusted certificates, no matter whether you are implementing the server or the client side of the protocol, with one exception. This file is often has a name like cacerts, and by default it may turn out to be a file named cacerts in your jre security directory. The filenames you gave are not defaults, so their contents are not obvious to me.

You may or may not need a keystore. The keystore points to a file containing private key material. You need a keystore if:
1) you are implementing the server side of the protocol, or
2) you are implementing the client side and you need to authenticate yourself to the server.

There is one exception to everything stated. If you are using certain anonymous DH ciphersuites, then neither side needs either a truststore or a keystore. The connection is unauthenticated.

Wednesday, October 21, 2009

How to use an annotation.

Defining an annotation type
To define an annotation type called Meta:


import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface Meta {
String data() default "fast";
}



Using an annotation
To use that annotation:


...
@Meta(data = "slow")
public void foo(){
...
}
...



Using the annotation meta data ("calm down dear, it's only an example").
To print out the meta data that the annotation defines for the example above:


public static void main(String[] args) {
for (Method method : MyClass.class.getMethods()) {
Annotation[] annotations = method.getAnnotations();
int num = annotations.length;
if(num==1){
System.out.println(((Meta)annotations[0]).data());
}
}
}

JAX-RS: The Java API for RESTful Web Services

JAX-RS: The Java API for RESTful Web Services

http://www.developer.com/java/article.php/3843846/JAX-RS-The-Java-API-for-RESTful-Web-Services.htm

Non-Blocking I/O Made Possible in Java

Non-Blocking I/O Made Possible in Java

http://www.developer.com/java/article.php/3837316/Non-Blocking-IO-Made-Possible-in-Java.htm

Monday, October 19, 2009

Learn to Use the New Annotation Feature of Java 5.0

A article for annotation of Java 5 from http://www.devx.com/Java/Article/27235/1954?pf=true

What Are Annotations?
In short, annotations are metadata or data about data. Annotations are said to annotate a Java element. An annotation indicates that the declared element should be processed in some special way by a compiler, development tool, deployment tool, or during runtime.

Annotations can be analyzed statically before and during compile time. Annotations will likely be used before compile time mainly to generate supporting classes or configuration files.For example, a code generator (XDoclet, for example) can use annotation data in an EJB implementation class to generate EJB interfaces and deployment descriptors for you, reducing both your effort and the error rate. The average developer will probably not be writing code-generation tools, so these annotation types are likely to be used out-of-the-box rather than authored anew.

Annotations will also be used for compile-time checking such as to produce warnings and errors for different failure scenarios. An example of an annotation that is used at compile time is the new @Deprecated annotation, which acts the same as the old @deprecated JavaDoc tag.

Annotations can be useful at runtime as well. Using annotations you could mark code to behave in a particular way whenever it is called.For example, you could mark some methods with a @prelog annotation.

Another way to use annotations at runtime is to use Aspect-Oriented Programming (AOP). AOP uses pointcuts—sets of points configured to executed aspects. You could define a pointcut that will execute an aspect for an annotated method. My guess is that developers would be more likely to write their own runtime annotation types than they would annotation types used for code generation and compile-time checking. Still, writing and understanding the code that accesses the annotations (the annotation consumer) at runtime is fairly advanced.

Annotating Code
Annotations fall into three categories: normal annotations, single member annotations, and marker annotations (see Table 1). Normal and single member annotations can take member values as arguments when you annotate your code.

1. Normal Annotations—Annotations that take multiple arguments. The syntax for these annotations provides the ability to pass in data for all the members defined in an annotation type.
Example: @MyNormalAnnotation(mem1="val1", mem2="val2") public void someMethod() { ... }

2. Single Member Annotations—An annotation that only takes a single argument has a more compact syntax. You don't need to provide the member name.
Example: @MySingleMemberAnnotation("a single value") public class SomeClass { ... }

3.Marker Annotations—These annotations take no parameters. They are used to mark a Java element to be processed in a particular way.
Example: @Deprecated public void doWork() { ... }

Any Java declaration can be marked with an annotation. That is, an annotation can be used on a: package, class, interface, field, method, parameter, constructor, enum (newly available in Java 1.5), or local variable. An annotation can even annotate another annotation. Such annotations are called meta-annotations.

Packages annotations are also allowed, but because packages are not explicitly declared in Java, package annotations must be declared in a source file called package-info.java in the directory containing the source files for the package.

Built-in Annotations
Java 1.5 comes packaged with seven pre-built annotations.
  • java.lang.Override,
  • java.lang.Deprecated,
  • java.lang.SuppressWarning,
    (The follows are meta-annotation.)
  • java.lang.annotation.Documented,
  • java.lang.annotation.Inherited,
  • java.lang.annotation.Retention,
  • java.lang.annotation.Target

    Declaring Annotation Types
    Now that you've learned a little about the annotations that come packaged with Java 1.5, you can move on to declaring your own annotation types.

    Here is a sample annotation type:


    public @interface MyAnnotationType {
    int someValue();
    String someOtherValue();
    String yesSomeOtherValue() default "[blank]";

    }



    The annotation consumers are the development tools, the compiler, or a runtime library that accesses the annotation data you created when you annotated your Java code.

    An example of how you can access your code during runtime using the reflection API.


    // The Annotation Type
    import java.lang.annotation.Retention;
    import static java.lang.annotation.RetentionPolicy.RUNTIME;

    @Retention(RUNTIME)
    public @interface GreetsTheWorld {
    public String value();
    }

    // The Annotated Class
    @GreetsTheWorld("Hello, class!")
    public class HelloWorld {

    @GreetsTheWorld("Hello, field!")
    public String greetingState;

    @GreetsTheWorld("Hello, constructor!")
    public HelloWorld() {
    }

    @GreetsTheWorld("Hello, method!")
    public void sayHi() {
    }
    }

    // The Annotation Consumer
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;

    public class HelloWorldAnnotationTest
    {
    public static void main( String[] args ) throws Exception
    {
    //access the class annotation
    Class clazz = HelloWorld.class;
    System.out.println( clazz.getAnnotation( GreetsTheWorld.class ) );

    //access the constructor annotation
    Constructor constructor =
    clazz.getConstructor((Class[]) null);
    System.out.println(
    constructor.getAnnotation(GreetsTheWorld.class));

    //access the method annotation
    Method method = clazz.getMethod( "sayHi" );
    System.out.println(method.getAnnotation(GreetsTheWorld.class));

    //access the field annotation
    Field field = clazz.getField("greetingState");
    System.out.println(field.getAnnotation(GreetsTheWorld.class));
    }
    }

  • Sunday, October 18, 2009

    Why did Hibernate update my database?

    From http://blog.xebia.com/2009/04/06/why-did-hibernate-update-my-database/

    Hibernate is a sophisticated ORM framework, that will manage the state of your persistent data for you. Handing over the important but difficult task of managing persistent state of your application to a framework has numerous advantages, but one of the disadvantages is that you sort of lose control over what happens where and when. One example of this is the dirty checking feature that Hibernate provides. By doing dirty checking, Hibernate determines what data needs to be updated in your database. In many cases, this feature is quite useful and will work without any issues, but sometimes you might find that Hibernate decides to update something that you did not expect. Finding out why his happened can be a rather difficult task.

    I was asked to look into some issue with a StaleObjectState exception the other day. StaleObjectState exceptions are used by hibernate to signal an optimistic locking conflict: While some user (or process) tries to save a data item, the same data item has already been changed in the underlying database since it was last read. Now the problem was that the process that was throwing the exception was the only process that was supposed to change that data. From a functional point of view there could not have been any other user or process that changed the data in the meantime. So what was going on?

    Digging around in the log for some time, we found that the data was updated by some other process that was supposed to only read that data. Somehow Hibernate decided that the data read by that process had become dirty and should be saved. So now he had to find out why Hibernate thought that data was dirty.

    Hibernate can perform dirty checking in several places in an application:

    1. When a transaction is being committed or a session is being flushed, obviously, because at that time changes made in the transaction or session should be persisted to the database
    2. When a query is being executed. To prevent missing changes that still reside in memory, Hibernate will flush data that might be queried to the database just before executing the query. It tries to be picky about this and not flush everything all the time, but only the data that might be queried.
    It is quite difficult to check all these places to find out where the data is being find dirty, especially when the process executes several queries.

    To find out why Hibernate deems the data to be dirty, we have to dig into the Hibernate internals and start debugging the framework code. The Hibernate architecture is quite complex. There are a number of classes that are involved in dirty checking and updating entities:

    The DefaultFlushEntityEventListener determines what fields are dirty. The internals of this class work on the list of properties of an entity and two lists of values: the values as loaded from the database and the values as currently known to the session. It delegates finding out the ''dirty-ness' of a field to the registered Interceptor and to the types of the properties.
    The EntityUpdateAction is responsible for doing the update itself. An object of this type will be added to a ActionQueue to be executed when a session is flushed.
    These classes show some of the patterns used in the internals of Hibernate: eventing and action queuing. These patterns make the architecture of the framework very clear, but they also make following what is going on sometimes very hard...

    As previously explained, flushing happens quite often and setting a breakpoint in the DefaultFlushEntityEventListener is not usually a good idea, because it will get hit very often. An EntityUpdateAction, however, will only get created when an update will be issued to the underlying database. So to find out what the problem was, I set a breakpoint in the constructor and backtracked from there. It turned out Hibernate could not determine the dirty state of the object and therefor decided to update the entity just to be save.

    As mentioned eralier, Hibernate uses the "loaded state" to determine whether an object is dirty. This is the state of the object (the values of its properties) when loaded form the database. Hibernate stores this information in its persistence context. When dirty checking, Hibernate compares these values to the current values. When the "loaded state" is not available, Hibernate effectively cannot do dirty checking and deems the object dirty. The only scenario, however, in which the loaded state is unavailable is when the object has been re-attached to the session and thus not loaded from the database. The process I was looking into, however did not work with detached data.

    There is one other scenario in which Hibernate will lose the "loaded state" of the data: When the session is being cleared. This operation will discard all state in the persistence context completely. It is quite a dangerous operation to use in your application code and it should only be invoked if you are very sure of what you're doing. In our situation, the session was being flushed and cleared at some point, leading to the unwanted updates and eventually the StaleObjectStateExceptions. An unwanted situation indeed. After removing the clear, the updates where gone and the bug was fixed.

    Using Hibernate can save a developer a lot of time, when things are running smoothly. When a problem is encountered, a lot of specialized Hibernate knowledge and a considerable amount of time is often needed to diagnose and solve it.

    Friday, October 16, 2009

    JPA and Hibernate Tutorial

    A tutorial website of hibernate.
    http://www.hibernate-training-guide.com/index.html


    Hibernate 3 Annotations Tutorial
    http://loianegroner.com/2010/06/hibernate-3-annotations-tutorial/

    Two slides from Sun.
    http://www.slideshare.net/caroljmcdonald/td09jpabestpractices2
    http://developers.sun.com/learning/javaoneonline/2007/pdf/TS-4902.pdf?

    http://java.sun.com/javaee/5/docs/tutorial/doc/bnbqw.html

    Basic Java Persistence API Best Practices
    http://www.oracle.com/technology/pub/articles/marx-jpa.html

    An IBM Book
    http://books.google.ca/books?id=ko5KTfIHjasC&printsec=frontcover&source=gbs_v2_summary_r&cad=0#v=onepage&q=&f=false

    Generic Repository - Generic DB access?

    Generic Repository (grepo) is an open source (ASLv2) framework for Java which allows you to access (database) repositories in a generic and consistent manner.

    The main features of the framework are:
    * generic support for Hibernate based DAOs
    * generic support for Jpa based DAOs
    * generic support for executing database stored-procedures and functions
    * highly customizable

    The "Generic Query" component allows to access databases using SQL queries. Currently the following ORM (Object Relational Mapping) tools/APIs are supported:

    * Native Hibernate API
    * Java Persistence API

    The "Generic Procedure" component allows to access databases using PLSQL (that is calling stored procedures and/or functions) without requiring custom implementations - gprocedure is build on top of the Spring (JDBC) framework.


    History
    Daniel Guggi

    The Generic Repository Framework (grepo) has its origins back in 2007. I started development after reading Per Mellqvist's article "Don't repeat the DAO". My employer BearingPoint INFONOVA GmbH develops and maintains various business applications for its customers (mainly telecom providers). The software is developed/extended by various development (scrum) teams. Even though we have a professional development environment (using professional/good tools and frameworks etc...) and development guidelines (detailed coding conventions etc...) it turned out that the data access layers in our software products got quite fragmented, inconsistent and bloated - mainly because of big development teams and large software products, the typicall daily project-stress and the always reoccoring (similar) boilerplate code for database access logic. So we started developing a framework which in turn was tuned and improved in order to achieve the following main goals for our software products:

    * Ensure coding conventions and guidelines.
    * Avoid boilerplate code for database access logic.
    * Improve development time and code quality.

    Finally we came up with a framework based on Spring and Hibernate. The framework is integrated in our software products for quite a while right now and is used for basically (at least about 90%) all new database related access objects. We are quite happy with the result and thus we decided to make it open source - and so the Generic Repository project was born.

    Echo is an open-source framework for developing rich web applications.

    I ever used the Echo 1.x and it was the first framework developing web application using server side development I had seen. I did a deep research on it 2004. I think the frameworks like it should be the future of web application development. But it isn't so far. Maybe I am wrong, but I still like these RIA frameworks.

    See http://www.nextapp.com/products/ for detail.

    Vaadin is a web application framework for Rich Internet Applications (RIA).

    Another server side implementation for web application development. It is really powerful - Vaadin.

    See http://vaadin.com/home for detail.

    how to access properties file in Spring

    http://technologiquepanorama.wordpress.com/2009/03/17/how_to_access_properties_file_in-spring/

    Saturday, October 10, 2009

    Configuring a JBoss + Spring + JPA (Hibernate) + JTA web application

    (From http://www.swview.org/node/214)
    Here's how one might go about deploying a Spring application in JBoss (4.something) that uses JPA with Hibernate as the provider for persistence and JTA for transaction demarcation.

    1. Define the Spring configuration file in the web.xml file

    <context-param>
            <description>Spring configuration file</description>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param>



    2. Define the Spring loader in the web.xml file

    <listener>
            <description>Spring Loader</description>
            <listener-class>
             org.springframework.web.context.ContextLoaderListener
            </listener-class>
    </listener>


    3. Define the persistence unit reference in the web.xml file (which in fact has no effect until the Servlet container supports Servlet spec 2.5):

    <persistence-unit-ref>
            <description>
                Persistence unit for the bank application.
            </description>
           
           <persistence-unit-ref-name>
                  persistence/BankAppPU
           </persistence-unit-ref-name>
            <persistence-unit-name>BankAppPU</persistence-unit-name>       
    </persistence-unit-ref>


    * Note that this is what enables "" which has been commented out in the below given Spring configuration file.

    * For the above to work well, your web.xml should start like this (note the version 2.5):

    <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">


    4. Here's the persistence.xml file. Make the changes to the as you have defined in your system (for example in a file like JBOSS_HOME/server/default/deploy/bank-ds.xml - See JBOSS_HOME/docs/examples/jca/ for templates).

    <?xml version="1.0" encoding="UTF-8"?>
    <persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
      <persistence-unit name="BankAppPU" transaction-type="JTA">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>java:BankAppDS</jta-data-source>
        <properties>
          <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup"/>
          <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
          <property name="jboss.entity.manager.factory.jndi.name" value="java:/BankAppPU"/>
          <property name="hibernate.hbm2ddl.auto" value="update"/>
        </properties>
      </persistence-unit>
    </persistence>


    5. Here's a sample Spring configuration file (applicationContext.xml):

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xmlns:tx="http://www.springframework.org/schema/tx"
           xmlns:jee="http://www.springframework.org/schema/jee"
           xsi:schemaLocation="
           http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
           http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd">

        <!-- In a fully J5EE compatible environment, the following xml tag should work in accessing the EMF -->          
    <!--
        <jee:jndi-lookup id="entityManagerFactory" jndi-name="java:/BankAppPU"/>
    -->
      
        <!-- Hack for JBoss 4.something until full compliance is reached -->
        <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
          <property name="persistenceUnitName" value="BankAppPU"/>
        </bean>

        <!-- Let's access the JTA transaction manager of the application server -->
        <bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager">
            <property name="transactionManagerName" value="java:/TransactionManager"/>
            <property name="userTransactionName" value="UserTransaction"/>
        </bean>
       
        <!-- Let's define a DAO that uses the EMF -->
        <bean id="accountHolderDAO" class="bankapp.dao.AccountHolderDAO">
            <property name="emf" ref="entityManagerFactory"/>
        </bean>
       
        <!-- This is a service object that we want to make transactional.
             You will have an interface implemented (AccountManager) in the class.
        -->
        <bean id="accountManager" class="bankapp.AccountManagerImpl">
            <property name="accountHolderDAO" ref="accountHolderDAO"/>
        </bean>
       
       
        <!-- The transactional advice (i.e. what 'happens'; see the <aop:advisor/> bean below) -->
        <tx:advice id="txAdvice" transaction-manager="txManager">
            <!-- the transactional semantics... -->
            <tx:attributes>
                <!-- all methods starting with 'get' are read-only transactions -->
                <tx:method name="get*" read-only="true"/>
                <!-- other methods use the default transaction settings (see below) -->
                <tx:method name="*" read-only="false" />
            </tx:attributes>
        </tx:advice>
       
       
        <!-- ensure that the above transactional advice runs for execution
          of any operation defined by the AccountManager interface -->
        <aop:config>
            <aop:pointcut id="accountManagerOperation",
               expression="execution(* bankapp.AccountManager.*(..))"/>
            <aop:advisor advice-ref="txAdvice" pointcut-ref="accountManagerOperation"/>
        </aop:config>
    </beans>


    6. Here's the sample AccountManagerImpl:

    public class AccountManagerImpl implements AccountManager {
       
        /** Creates a new instance of AccountManagerImpl */
        public AccountManagerImpl() {
        }


        private AccountHolderDAO accountHolderDAO;
       
        public AccountHolder createAccountHolder(AccountHolder accountHolder) throws BankException {
            return accountHolderDAO.create(accountHolder);
        }


        public AccountHolderDAO getAccountHolderDAO() {
            return accountHolderDAO;
        }


        public void setAccountHolderDAO(AccountHolderDAO accountHolderDAO) {
            this.accountHolderDAO = accountHolderDAO;
        } 
    }




    7. Here's the sample AccountHolderDAO:

    public class AccountHolderDAO {
       
        /** Creates a new instance of AccountHolderDAO */
        public AccountHolderDAO() {
        }
       
        private EntityManagerFactory emf;


        public EntityManagerFactory getEmf() {
            return emf;
        }


        public void setEmf(EntityManagerFactory emf) {
            this.emf = emf;
        }
       
        public AccountHolder create(AccountHolder newAccountHolder) throws BankException {
            try {
               
                // JTA Transaction assumed to have been started by AccountManager (Spring tx advice)
                EntityManager em = emf.createEntityManager();
                //em.getTransaction().begin(); - Not required
                em.persist(newAccountHolder);
                //em.getTransaction().commit(); - Not required
                return newAccountHolder;
                // JTA Transaction will be completed by Spring tx advice
               
            } catch (Exception e) {
                throw new BankException("Account creation failed" + e.getMessage(), e);
            }
        } 
    }




    You will have some other code accessing the Spring bean "accountManager" and invoke the createAccountHolder() with the required parameters. Things should work well.

    Java Persistence API

    The Java Persistence API is a POJO persistence API for object/relational mapping. It contains a full object/relational mapping specification supporting the use of Java language metadata annotations and/or XML descriptors to define the mapping between Java objects and a relational database. Java Persistence API is usable both within Java SE environments as well as within Java EE.

    It supports a rich, SQL-like query language (which is a significant extension upon EJB QL) for both static and dynamic queries. It also supports the use of pluggable persistence providers.

    The Java Persistence API originated as part of the work of the JSR 220 Expert Group to simplify EJB CMP entity beans. It soon became clear to the expert group, however, that a simplification of EJB CMP was not enough, and that what was needed was a POJO persistence framework in line with other O/R mapping technologies available in the industry. The Java Persistence API draws upon the best ideas from persistence technologies such as Hibernate, TopLink, and JDO.

    Thursday, October 08, 2009

    HTML ASCII Reference

    HTML ASCII Reference
    http://www.w3schools.com/TAGS/ref_ascii.asp