1
@Singleton
public class EntityManagerFactoryUtil implements Serializable {

private static final long serialVersionUID = -5769561190804055727L;

/**
 * This attribute mClassname is for logging the Class Name
 */
private final static String mClassName = "EntityManagerFactoryUtil";

/**
 * This attribute mLog used for write to log.
 */
private static Logger mLog = Logger.getLogger(EntityManagerFactoryUtil.class.getName());

/**
 * This method is used to create an instance of Entity Manager Factory.
 * @throws Exception
 * @return entityManagerFactory
 * @author ashokkumar_ks@solartis.net
 * @since  06-Sep-2012
 */
public  EntityManagerFactory getEntityManagerFactory() throws Exception {
    final String methodName = "getEntityManagerFactory";
    mLog.debug("Entered Class Name ::" + mClassName + " Method Name ::" + methodName);
    EntityManagerFactory entityManagerFactory=null;
    try {
        entityManagerFactory =Persistence.createEntityManagerFactory("StudentManagementSystem");
    } catch (Exception creationError) {
        mLog.error("Entered ::" + mClassName + "Error ::" +creationError.getMessage());
        throw new ExceptionInInitializerError(creationError);
    }
    mLog.debug("Exited Class Name ::" + mClassName + "Method Name ::" + methodName + " Object Reference :: " +entityManagerFactory);
    return entityManagerFactory;
}

}


これは私のビジネスログです

@EJB 
private EntityManagerFactoryUtil mEntityManagerFactory;

public StudentDetail save(StudentDetail studentInformation) {
    final String methodName = "Save";
    mLog.debug("Entered  ClassName::" + mClassName + " MethodName :: " + methodName);
    EntityManager entityManager = null;
    EntityTransaction entityTransaction = null;
    try { 
        entityManager = mEntityManagerFactory.getEntityManagerFactory().createEntityManager();
        if (entityManager != null && entityManager.isOpen()) {
            entityTransaction = entityManager.getTransaction();
            if(entityTransaction!=null) {
                entityTransaction.begin();
                if(entityTransaction.isActive()) {

                    // save student information into relation model
                    entityManager.persist(studentInformation);  
                    entityTransaction.commit();
                }
            }
        }
    } catch (Exception saveException) {
        try {
            if (entityManager != null && entityManager.isOpen()) {
                if(entityTransaction!=null  && entityTransaction.isActive()) {
                    entityTransaction.rollback();
                }
            }
        }catch (Exception transactionException) {
            mLog.warn("Exception in ClassName :: " + mClassName+ " MethodName::" + methodName + " warn :: "
                    + transactionException.getMessage() + "Student ID :: "+studentInformation.getId());
        }
            mLog.error("Exception in ClassName :: " + mClassName+ " MethodName::" + methodName + " Error :: "
                + saveException.getMessage() + "Student ID :: "+ studentInformation.getId());
    } finally {
        try {
            if (entityManager != null && entityManager.isOpen()) {
                entityManager.close();
            }
        } catch (Exception nullException) {
            mLog.warn("Exception in ClassName :: " + mClassName+ " MethodName::" + methodName + " warn :: "
                    + nullException.getMessage() + " Student ID :: "+ studentInformation.getId());
        }
        mLog.debug("Exited  ClassName::" + mClassName + " MethodName :: "+ methodName + "Student ID :: "+ studentInformation.getId());
    }
    return studentInformation;
}

Save メソッドを呼び出すたびに...新しいオブジェクトが作成され、ビジネス ロジックにアクセスするたびに.. ?? しかし、Singleton Mean ... 1回限りのインスタンス作成????

10:31:49,413 INFO [stdout] (http--0.0.0.0-8080-2) 22754 [http--0.0.0.0-8080-2] DEBUG com.dms.util.EntityManagerFactoryUtil - 終了したクラス名 ::EntityManagerFactoryUtilMethod 名::getEntityManagerFactory オブジェクト リファレンス :: org.hibernate.ejb. EntityManagerFactoryImpl@130df8

10:31:56,232 INFO [stdout] (http--0.0.0.0-8080-3) 29573 [http--0.0.0.0-8080-3] DEBUG com.dms.util.EntityManagerFactoryUtil - 終了したクラス名 ::EntityManagerFactoryUtilMethod 名::getEntityManagerFactory オブジェクト リファレンス :: org.hibernate.ejb. EntityManagerFactoryImpl@5170a8

毎回異なるオブジェクトが作成されます.. :(

4

4 に答える 4

1

最後に私は解決策を得ました..何か間違っていることを教えてください

@Startup

@Singleton

public EntityManagerFactory getEntityManagerFactory() throws Exception {
    final String methodName = "getEntityManagerFactory";
    mLog.debug("Entered Class Name ::" + mClassName + " Method Name ::" + methodName);
    try {
        if (!mEntityManagerFactory.isOpen()) {
            createEntityManagerFactory();
        }
    } catch (Exception creationException) {
        mLog.error("Entered ::" + mClassName + " Method Name :: " + methodName + " Error ::" + creationException.getMessage());
        throw new ExceptionInInitializerError(creationException);
    }
    mLog.debug("Exited Class Name ::" + mClassName + " Method Name :: " + methodName);
    return mEntityManagerFactory;
}

 /**
  * This method is used to create Entity Manager Factory to look the persistence unit name.
  * @author ashokkumar_ks@solartis.net
  * @since  08-Sep-2012
  */
@PostConstruct
public void createEntityManagerFactory() {
    final String methodName = "createEntityManagerFactory";
    mLog.debug("Entered Class Name ::" + mClassName + " Method Name ::"+ methodName);
    try {
        mEntityManagerFactory = Persistence.createEntityManagerFactory("StudentManagementSystem");
    } catch (Exception exception) {
        mLog.error("Entered ::" + mClassName +" Method Name :: "+ methodName + " Error ::" +exception.getMessage());
    }
    mLog.debug("Exited Class Name ::" + mClassName + " Method Name ::" + methodName + " Object Reference :: " +mEntityManagerFactory);
}

/**
 * This method is used to destroy the instance of entityManagerFactory.
 * @author ashokkumar_ks@solartis.net
 * @since 08-Sep-2012
 */
@PreDestroy
public void destroyEntityManagerFactory() {
    final String methodName = "destroyEntityManagerFactory";
    mLog.debug("Entered Class Name ::" + mClassName + " Method Name :: "+ methodName);
    try {
        if (mEntityManagerFactory != null && mEntityManagerFactory.isOpen()) {
            mEntityManagerFactory.close();
        }
    } catch (Exception exception) {
        mLog.error("Entered ::" + mClassName +" Method Name :: "+ methodName + " Error ::" +exception.getMessage());
    }
    mLog.debug("Exited Class Name ::" + mClassName + " Method Name :: " + methodName);
}
于 2012-09-18T09:08:09.440 に答える
1

@Singletonアノテーションは、ユーティリティ クラスではなくセッション Bean 用です。

Component-defining annotation for a singleton session bean.

@PersistenceContextアノテーションを使用して、エンティティ マネージャ ファクトリを指定し、EntityManager を注入できます。

 @PersistenceContext(unitName = "StudentManagementSystem")
 private EntityManager entityManager;
于 2012-09-18T05:21:07.167 に答える
1

Singleton クラスEntityManagerFactoryUtilは依然として一意ですが、呼び出しごとに EntityManagerFactory の新しいインスタンスを作成しています。

PersistenceContext の注入を使用して、コンテナによってアプリケーション全体に伝播させます。

リンク: Java EE 6 チュートリアル

于 2012-09-18T05:36:04.393 に答える
0

シングルトンはデザインパターンです。つまり、複数のインスタンスが発生しないように、目的のシングルトンクラスを実装する必要があります。

実装例は次のようになります。

public class Singleton {
        private static volatile Singleton instance = null;

        private Singleton() {   }
        // Each time get Instance is called the actuall one is checked,
        // if exists no new one is created. Only if doesnt a new one is created       
        public static Singleton getInstance() { 
                if (instance == null) {
                        synchronized (Singleton.class){
                                if (instance == null) {
                                        instance = new Singleton();
                                }
                      }
                }
                return instance;
        }
}

あなたの例では、MethodeはMethodegetEntityManagerFactoryと同等ですgetInstance

于 2012-09-18T05:29:13.980 に答える