Spring集積Hibernate,リバースエンジニアリングを用いて生成したPOJOクラスとDAOクラス


一度SSHを使用したプロジェクトでは、hibernateインバースエンジニアリングを使用してPOJOクラスとDAOクラスを生成し、非常に便利でしたが、使い始めたばかりの頃に小さな問題が見つかりました.
1.リバースエンジニアリングで自動的に生成されるPOJOクラス.
Hibernateは、各テーブルの各フィールドに基づいて対応するプロパティを生成します.
次のようになります.
public class Account extends com.common.bean.BasePojo implements
        java.io.Serializable {

    // Fields

    private Integer acId;
    private String acAccount;
    private String acPass;
    private Role role;
    private Date acLastTime;
    private Set peopleAccounts = new HashSet(0);

    // Constructors
    ....

    // Property accessors
    ....
}

一部の方法を省略して、role属性はRoleテーブルの外部キーであり、peopleAccountsは他のテーブルの外部キーの集合である.対応hbm.xmlテーブル
....
<many-to-one name="role" class=text.Account" fetch="select">
            <column name="roleId" not-null="true">
                <comment>  ID</comment>
            </column>
</many-to-one>

<set name="peopleAccounts" inverse="true">
            <key>
                <column name="AC_ID">
                    <comment>    ID</comment>
                </column>
            </key>
                <one-to-many class="text.PeopleAccount" />
        </set>

このPOJOクラスとXMLテーブルでは、逆方向エンジニアリングがすべてのプロパティを生成してくれますが、必ずしも必要としないプロパティも含まれています.現在のオブジェクトがAオブジェクトであると仮定すると,set集合はAオブジェクトを参照する他のすべてのオブジェクトの集合を格納し,B集合の代わりにB集合を用い,B集合の各オブジェクトはAオブジェクトを1つ保持し,そのまま互いに保持する.Aオブジェクトをjsonに変換してデータ転送する必要がある場合、うっかり冗長データが大量に発生したり、
java.lang.StackOverflowError
	java.lang.Class.getClassLoader(Class.java:609)
	java.lang.Package.getPackage(Package.java:330)
	java.lang.Class.getPackage(Class.java:717)
	org.json.JSONObject.populateInternalMap(JSONObject.java:357)
	org.json.JSONObject.<init>(JSONObject.java:310)
	org.json.JSONObject.populateInternalMap(JSONObject.java:361)
	org.json.JSONObject.<init>(JSONObject.java:310)

爆桟ですが、ここにlazy=「false」が設置される可能性もあります.次回は怠け者のロードメカニズムについて議論します.
したがって、一般的には、特に必要でなければ、このAクラスとxmlテーブルのsetセットを削除することを選択することができます.
もちろん、Aオブジェクトにこのsetセットを保持する必要がある場合は、setセット内のAオブジェクトの保持を空にする方法を知っています.△他の人は何かいい方法がありますか.伝言討論を歓迎します.
2.リバースエンジニアリングで生成されたDAOクラス
public class AccountDAO extends HibernateDaoSupport {
    private static final Logger log = LoggerFactory.getLogger(AccountDAO.class);
    // property constants
    public static final String AC_ACCOUNT = "acAccount";
    public static final String AC_PASS = "acPass";

    protected void initDao() {
        // do nothing
    }

    public void save(Account transientInstance) {
        log.debug("saving Account instance");
        try {
            getHibernateTemplate().save(transientInstance);
            log.debug("save successful");
        } catch (RuntimeException re) {
            log.error("save failed", re);
            throw re;
        }
    }

    public void delete(Account persistentInstance) {
        ....
    }

    public Account findById(java.lang.Integer id) {
       ....
    }

    public List findByExample(Account instance) {
        ....
    }

    public List findByProperty(String propertyName, Object value) {
        ....
    }

    public List findByAcAccount(Object acAccount) {
        return findByProperty(AC_ACCOUNT, acAccount);
    }

    public List findByAcPass(Object acPass) {
        return findByProperty(AC_PASS, acPass);
    }

    public List findAll() {
        ....
    }



/** 
*                       ,         。 
*    session           ,    ,         ,               ,
*           。 
*/ 
    public Account merge(Account detachedInstance) {
       log.debug("merging Account instance");
        try {
            Account result = (Account) getHibernateTemplate().merge(
                    detachedInstance);
            log.debug("merge successful");
            return result;
        } catch (RuntimeException re) {
            log.error("merge failed", re);
            throw re;
        }
    }


/** 
*             。 
*          ,  save    。         ,  update      Session    。 
*/ 
    public void attachDirty(Account instance) {
        log.debug("attaching dirty Account instance");
        try {
            getHibernateTemplate().saveOrUpdate(instance);
            log.debug("attach successful");
        } catch (RuntimeException re) {
            log.error("attach failed", re);
            throw re;
        }
    }

/** 
*                
*/ 
    public void attachClean(Account instance) {
        log.debug("attaching clean Account instance");
        try {
            getHibernateTemplate().lock(instance, LockMode.NONE);
            log.debug("attach successful");
        } catch (RuntimeException re) {
            log.error("attach failed", re);
            throw re;
        }
    }

    public static AccountDAO getFromApplicationContext(ApplicationContext ctx) {
        return (AccountDAO) ctx.getBean("AccountDAO");
    }
}

これは標準的に生成されたDAOクラスであり,いくつかの基本的によく用いられる方法をカプセル化している.いずれの方法においても、このDAOクラスのデータベースに対する操作はHibernateTemplateを使用して行われる.だからimenのためにこれらの方法を呼び出すには、このような呼び出しが必要です.
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
AccountDAO accountDAO = AccountDAO.getFromApplicationContext(ac);
accountDAO.XXXX();

HibernateはSpringによって管理されているため、プロファイルをロードしてから、プロファイルで定義されたエンティティクラスbeanに基づいてSpringのBeanファクトリからDAOクラスインスタンスを生成する必要があります.このDAOクラスのオブジェクトを直接newで出すと
 getHibernateTemplate();

空ポインタ異常を放出します.
自動生成merge(Account detachedInstance)、attachDirty(Account instance)、attachClean(Account instance)メソッドが注釈に作用して与えられる.
ApplicationContextおよびHibernateTemplateの学習については、次のURLを参照してください.
http://www.iteye.com/magazines/72Springのソース学習
http://blog.csdn.net/lufeng20/article/details/7314945HibernateTemplateソースコード