东东东 陈煜东的博客

标签存档: JavaEE

hibernate实体自关联映射

近日在开发系统的一个功能的时候出现问题了,花了6天寻找解决方案。先来看看数据库的category表

数据库category结构
类型
id int(11)
name varchar(255)
parent int(11)

遇见的问题

问题表述:当我从数据库中根据id取出一个category出来的时候,对名字进行更改,然后再保存,就会在数据库中insert一条父记录。此困惑确实不解。还有就是使用junit使用模拟http请求测试也不会出问题使用tomcat就又insert了。

Hibernate对象的3中状态

对于出现的问题有,说保存了一个瞬时对象,不能保存。hibernate object references an unsaved transient instance。关于瞬时态(transien)、游离态(detached、托管态)、持久态(persistent)这里有张图

Hibernate对象的3种状态,瞬时态(transien)、游离态(detached)、持久态(persistent)。通过hibernate的save、update等方法进行转换。 图片来源:http://blog.csdn.net/xiaokaibupabupa/article/details/6785208

有说法是从数据库中取出一个对象,状态变成持久态,在session关闭后,就变成游离态。要想关联的parent目录也想要持久态,需要在hibernate的映射文件中需要使用cascade=”all”或者cascade=”save-update”能使父目录变为持久态。但是我在设添加此设置不管用,还是会想数据库insert一条记录。

我让许多同学来查看代码,都觉得没有什么问题,我就让我同学在自己的电脑上假设一个环境来测试,在他的电脑上也没问题。将同学的配置文件弄到自己的机器上测试,过了许多天,这个问题都没解决。

于是我就从MyEclipse的自带的Hibernate Inverse Engineering功能从数据库导出DAO文件、pojo文件、映射文件。然后将我自己的映射文件按照自动生成的来替换。但是还是不行。

更为烦恼的是,自己使用junit写的测试用例,来模拟http请求,能正确执行,但是通过tomcat来运行就又会出现insert的情况。

不过我在查看控制台的输出的时候,发现取出category进行了一个事务和session,update的时候又进行了一个事务和session。我觉得有点问题,因为这样使用了两个事务,我觉得在Spring的配置事务出现了一些问题。

现在把处理category逻辑放到了service层来进行,本来是在action层,感觉情况有些好转。

hibernate映射文件

把配置文件给贴出来看看,hibernate对象自关联自身配置。

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.chenyudong.pojo.Category" >
        <id name="id" column="id" >
            <generator class="identity" ></generator>
        </id>
        <property name="name" column="name" />
        <set name="childCategory" inverse="true" cascade="all"  fetch="join" lazy="false">
            <key column="parentID"></key>
            <one-to-many class="com.chenyudong.pojo.Category" />
        </set>
        <many-to-one name="parent" class="com.chenyudong.pojo.Category"
            column="parentID" ></many-to-one>
    </class>  
</hibernate-mapping>

我们可以看见,在外键的一方,需要使用many-to-one或者其他的one-to-one或者one-to-manymany-to-many配置映射关系。此hibernate的映射关系,相当于数据库中的外键关联。many-to-one说明可以多个目录的parentID相同,指向同一个父目录。而set这个标签,则用于主键一方上,表明指向该记录的集合。

属性inverse描述的是对象之间关联关系的控制方向,也就是由哪个对象来维护他们之间的关联,而属性casade描述的是层级之间的连锁操作方式,也就是一个对象的改变是否也要同步对其管理对象进行相应的操作。

嗯,在耽误了许久的项目后继续赶进度了。

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: hibernate实体自关联映射 – https://www.chenyudong.com/archives/hibernate-entity-self-reference-mapping.html

分类: JavaEE

MyEclipse禁用JavaScript检查功能

Myeclipse对Javascript的检测特别不习惯,有时候JS文件里面加着struts代码,就会报错。只能禁用JavaScript检查功能了。

在MyEclipse的Project目录下有一个隐藏文件.project,这个文件放着一些project的配置

我直接贴出来吧,将以下的删除即可。

<buildcommand>
    <name>org.eclipse.wst.jsdt.core.javascriptValidator</name>
    <arguments>
    </arguments>
</buildcommand>

<nature>org.eclipse.wst.jsdt.core.jsNature</nature>

具体情况可见该文件。这样重启MyEclipse就不会启用Javascript检查功能了。

<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
    <name>trybest</name>
    <comment></comment>
    <projects>
    </projects>
    <buildSpec>
        <buildCommand>
            <name>org.eclipse.wst.jsdt.core.javascriptValidator</name>
            <arguments>
            </arguments>
        </buildCommand>
        <buildCommand>
            <name>org.eclipse.wst.common.project.facet.core.builder</name>
            <arguments>
            </arguments>
        </buildCommand>
        <buildCommand>
            <name>com.genuitec.eclipse.j2eedt.core.WebClasspathBuilder</name>
            <arguments>
            </arguments>
        </buildCommand>
        <buildCommand>
            <name>org.eclipse.jdt.core.javabuilder</name>
            <arguments>
            </arguments>
        </buildCommand>
        <buildCommand>
            <name>com.genuitec.eclipse.j2eedt.core.J2EEProjectValidator</name>
            <arguments>
            </arguments>
        </buildCommand>
        <buildCommand>
            <name>com.genuitec.eclipse.j2eedt.core.DeploymentDescriptorValidator</name>
            <arguments>
            </arguments>
        </buildCommand>
        <buildCommand>
            <name>org.eclipse.wst.validation.validationbuilder</name>
            <arguments>
            </arguments>
        </buildCommand>
        <buildCommand>
            <name>com.genuitec.eclipse.ast.deploy.core.DeploymentBuilder</name>
            <arguments>
            </arguments>
            </buildCommand>
    </buildSpec>
    <natures>
        <nature>com.genuitec.eclipse.ast.deploy.core.deploymentnature</nature>
        <nature>com.genuitec.eclipse.j2eedt.core.webnature</nature>
        <nature>org.eclipse.jdt.core.javanature</nature>
        <nature>org.eclipse.wst.common.project.facet.core.nature</nature>
        <nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
        <nature>org.eclipse.wst.jsdt.core.jsNature</nature>
    </natures>
</projectDescription>

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: MyEclipse禁用JavaScript检查功能 – https://www.chenyudong.com/archives/myeclipse-disable-javascript-validatation.html

分类: JavaEE

Apache tomcat 安装与配置

Apache Tomcat作为一个开源的Java Servlet容器和支持JavaServer Pages技术的软件,在许多开发人员里使用的非常广,就连许多企业也使用它。

下载Tomcat

先从Tomcat 7下载页面下载文件,Windows下我选择Binary Distributions中的64-bit Windows zip(32bit的选择32bit的文件)。

安装Tomcat、设置Tomcat环境变量

Windows下安装

将文件解压缩到一个目录下,Windows版的已经给编译好了,直接用。设置CATALINA_HOME、JAVA_HOME环境变量,在环境变量中添加

CATALINA_HOME : D:\mydevelop\server\apache-tomcat-7.0.22
JAVA_HOME : E:\Program Files (x86)\Java\jdk1.7.0_02

为了更好的编写项目,如果没有请添加以下环境变量,

PATH : ;.;%JAVA_HOME%\bin;

打开 {$TOMCAT_HOME}\bin\starup.bat 运行服务器,访问 http://localhost:8080/ 如果可以访问则成功。

Linux下安装

1.将下载来的文件解压缩

tar -zxvf apache-tomcat-7.0.33.tar.gz

2.复制文件

cp -r apache-tomcat-7.0.33 /usr/local/tomcat

3.启动服务器

/usr/local/tomcat/bin/startup.sh

配置Tomcat

打开编辑%CATALINA_HOME%\conf\server.xml

更改端口号

<!-- 用http://localhost/ 访问 -->

<!--修改后-->

Linux下使用1024以下端口需要权限。

添加web app

    ... <!-- 添加Context元素,使用http://localhost/dl/ 访问子目录 -->
<Host name="baiduclub" debug="0" appBase=""
 unpackWARs="true" autoDeploy="true" deployIgnore=".svn"
 xmlValidation="false" xmlNamespaceAware="false">
 <Logger className="org.apache.catalina.logger.FileLogger"
 directory="logs" prefix="baiduclub_log." suffix=".txt"
 timestamp="true"/>
 <Context path="/dl/" reloadable="true" docBase="D:\mydevelop\po\WebRoot" />
 </Host>

如果有需要的话,可以安装一个Mysql数据库,用来涉及到数据库的实验。

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: Apache tomcat 安装与配置 – https://www.chenyudong.com/archives/apache-tomcat-install-and-configure.html

分类: Java, JavaEE

Copyright © 2017 东东东 陈煜东的博客 粤ICP备13059639号-1

SITEMAP回到顶部 ↑