Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JPA关系持久性_Jpa_Persistence_Relationship - Fatal编程技术网

JPA关系持久性

JPA关系持久性,jpa,persistence,relationship,Jpa,Persistence,Relationship,我在类路径上使用JPA2和以下JAR [INFO] +- org.aspectj:aspectjrt:jar:1.6.9:compile [INFO] +- org.aspectj:aspectjweaver:jar:1.6.9:compile [INFO] +- org.springframework:spring-aspects:jar:3.1.0.M2:compile [INFO] | +- org.spri

我在类路径上使用JPA2和以下JAR

          [INFO] +- org.aspectj:aspectjrt:jar:1.6.9:compile
          [INFO] +- org.aspectj:aspectjweaver:jar:1.6.9:compile
          [INFO] +- org.springframework:spring-aspects:jar:3.1.0.M2:compile
          [INFO] |  +- org.springframework:spring-beans:jar:3.1.0.M2:compile
          [INFO] |  |  \- org.springframework:spring-core:jar:3.1.0.M2:compile
          [INFO] |  \- org.springframework:spring-context-support:jar:3.1.0.M2:compile
          [INFO] +- com.googlecode.commonspringaspects:common-spring-aspects:jar:1.0.9:compile
          [INFO] |  +- net.sf.ehcache:ehcache-core:jar:1.7.2:compile
          [INFO] |  \- com.jamonapi:jamon:jar:2.4:compile
          [INFO] +- com.jamon:jamonapi:jar:2.73:compile
          [INFO] +- javax.validation:validation-api:jar:1.0.0.GA:compile
          [INFO] +- org.springframework:spring-context:jar:3.1.0.M2:test (scope not               updated to compile)
          [INFO] |  +- org.springframework:spring-aop:jar:3.1.0.M2:test
          [INFO] |  |  \- aopalliance:aopalliance:jar:1.0:test
          [INFO] |  +- org.springframework:spring-expression:jar:3.1.0.M2:test
          [INFO] |  \- org.springframework:spring-asm:jar:3.1.0.M2:test
          [INFO] +- org.springframework:spring-orm:jar:3.1.0.M2:test
          [INFO] |  +- org.springframework:spring-jdbc:jar:3.1.0.M2:test
          [INFO] |  \- org.springframework:spring-tx:jar:3.1.0.M2:test
          [INFO] +- org.mockito:mockito-all:jar:1.9.0-rc1:test
          [INFO] +- dirty-mockito:dirty-mockito:jar:0.4:test
          [INFO] +- org.hibernate:hibernate-validator:jar:4.2.0.Final:test
          [INFO] +- org.hsqldb:hsqldb:jar:2.2.4:compile
          [INFO] +- org.hibernate:hibernate-entitymanager:jar:3.6.2.Final:compile
          [INFO] |  +- org.hibernate:hibernate-core:jar:3.6.2.Final:compile
          [INFO] |  |  +- antlr:antlr:jar:2.7.6:compile
          [INFO] |  |  +- commons-collections:commons-collections:jar:3.1:compile
          [INFO] |  |  +- dom4j:dom4j:jar:1.6.1:compile
          [INFO] |  |  +- org.hibernate:hibernate-commons-              annotations:jar:3.2.0.Final:compile
          [INFO] |  |  \- javax.transaction:jta:jar:1.1:compile
          [INFO] |  +- cglib:cglib:jar:2.2:compile
          [INFO] |  |  \- asm:asm:jar:3.1:compile
          [INFO] |  +- javassist:javassist:jar:3.12.0.GA:compile
          [INFO] |  \- org.hibernate.javax.persistence:hibernate-jpa-2.0-              api:jar:1.0.0.Final:compile
          [INFO] +- javax.inject:javax.inject:jar:1:compile
          [INFO] +- junit:junit:jar:4.8.1:test
          [INFO] +- org.springframework:spring-test:jar:3.1.0.M2:test
          [INFO] +- commons-logging:commons-logging:jar:1.1.1:compile
          [INFO] +- org.slf4j:slf4j-api:jar:1.5.10:compile
          [INFO] +- org.slf4j:jcl-over-slf4j:jar:1.5.10:compile
          [INFO] +- org.slf4j:slf4j-log4j12:jar:1.5.10:compile
          [INFO] \- log4j:log4j:jar:1.2.15:compile
我的模型如下

<access>FIELD</access>
<mapped-superclass class="com.compnay.qube.foundation.core.model.BaseModel">
    <attributes>
        <id name="uid">
            <column name="UID" nullable="false" />
            <generated-value strategy="AUTO" />
        </id>

        <basic name="creationDate">
            <column name="CREATIONDATE" updatable="false" nullable="false" />
            <temporal>TIMESTAMP</temporal>
        </basic>
        <basic name="modificationDate">
            <column name="MODIFICATIONDATE" updatable="true" nullable="true"
                column-definition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP" />
            <temporal>TIMESTAMP</temporal>
        </basic>

        <one-to-many name="changeLog">

            <cascade>
                <cascade-persist />
                <cascade-merge />
                <cascade-refresh />
            </cascade>
        </one-to-many>

        <!-- <element-collection name="changeLog" fetch="LAZY"> </element-collection> -->
    </attributes>
</mapped-superclass>

<entity class="com.compnay.qube.services.core.user.model.User"
    name="User">
    <table name="USER" />
    <inheritance strategy="JOINED" />
    <named-query name="findUserByUserName">
        <query><![CDATA[select user from User user where 
user.userName = :userName]]></query>
    </named-query>
    <attributes>
        <basic name="userName">
            <column name="USERNAME" length="100" updatable="false"
                unique="false" />
        </basic>
        <basic name="passsword">
            <column name="PASSWORD" length="100" updatable="false"
                unique="false" />
        </basic>
        <basic name="email">
            <column name="EMAIL" length="100" updatable="false" unique="false" />
        </basic>
        <basic name="optIn">
            <column name="OPTIN" updatable="true" unique="false" />
        </basic>
        <one-to-many name="userRoles">
            <join-table name="USER_ROLES">
                <join-column name="USER_ID" />
                <inverse-join-column name="ROLE_ID" />
            </join-table>
            <cascade>
                <cascade-persist />
                <cascade-merge />
                <cascade-refresh />
            </cascade>
        </one-to-many>

    </attributes>
</entity>

<entity class="com.compnay.qube.services.core.user.model.Role"
    name="ROLE">
    <table name="ROLE" />
    <inheritance strategy="JOINED" />
    <named-query name="findByUniqueName">
        <query><![CDATA[select role from ROLE role where role.roleName = :roleName]]></query>
    </named-query>
    <attributes>
        <basic name="roleName">
            <column name="ROLE" length="100" updatable="true" unique="true" />
        </basic>
        <!--<transient name="user" /> -->
        <many-to-one name="user">
            <cascade>
                <cascade-all />
            </cascade>
        </many-to-one>
    </attributes>
</entity>
public void create(M model) throws DAOException {
    try {
        entityManager.persist(model);
    } catch (RollbackException rollBackExp) {
        ErrorCode errorCode = new ErrorCode();
        // SQLException sqle = (SQLException) pExp.getCause().getCause();
        // errorCode = errorHandler.getErrorCode(sqle);
        // errorCode.setCode(sqle.getErrorCode() + "");
        throw new DAOException(errorCode, rollBackExp);
    } catch (PersistenceException pExp) {
        ErrorCode errorCode = new ErrorCode();
        // SQLException sqle = (SQLException) pExp.getCause().getCause();
        // errorCode = errorHandler.getErrorCode(sqle);
        // errorCode.setCode(sqle.getErrorCode() + "");
        throw new DAOException(errorCode, pExp);
    }finally{
        entityManager.flush();
    }
}
                    if(roles.size() == 0){
            Role arole = initRole(RoleType.ADMIN.name(),
                    CREATION_DATE_YESTERDAY, MODIFICATION_DATE_TODAY);
            Role srole = initRole(RoleType.SUPER_USER.name(),
                    CREATION_DATE_YESTERDAY, MODIFICATION_DATE_TODAY);
            Role urole = initRole(RoleType.USER.name(),
                    CREATION_DATE_YESTERDAY, MODIFICATION_DATE_TODAY);

            roles.put(arole.getRoleName(), arole);
            roles.put(srole.getRoleName(), srole);
            roles.put(urole.getRoleName(), urole);
        }
        User user_one = initUser("user" + (i+1) , "user" + (i+1), "user" + (i+1) + "@user.com",
                CREATION_DATE_YESTERDAY, MODIFICATION_DATE_TODAY);


        user_one.setUserRoles(new HashSet<Role>(roles.values()));

        Enumeration<String> roleKeys = roles.keys();
        while(roleKeys.hasMoreElements()){
            String key = roleKeys.nextElement();
            Role role = roles.get(key);
            role.setUser(user_one);
        }

        try {
            userService.create(user_one);
            Set<Role> urole = user_one.getUserRoles();
            for (Role role : urole) {
                roles.put(role.getRoleName(), role);
            }
            //logger.debug(user_one);
        } catch (ServiceException e) {
            e.printStackTrace();
        }

服务只是将其委托给dao,现在由spring封装在事务中。当我运行测试来持久化用户时,它工作正常,但是当我向用户添加用户角色时

<access>FIELD</access>
<mapped-superclass class="com.compnay.qube.foundation.core.model.BaseModel">
    <attributes>
        <id name="uid">
            <column name="UID" nullable="false" />
            <generated-value strategy="AUTO" />
        </id>

        <basic name="creationDate">
            <column name="CREATIONDATE" updatable="false" nullable="false" />
            <temporal>TIMESTAMP</temporal>
        </basic>
        <basic name="modificationDate">
            <column name="MODIFICATIONDATE" updatable="true" nullable="true"
                column-definition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP" />
            <temporal>TIMESTAMP</temporal>
        </basic>

        <one-to-many name="changeLog">

            <cascade>
                <cascade-persist />
                <cascade-merge />
                <cascade-refresh />
            </cascade>
        </one-to-many>

        <!-- <element-collection name="changeLog" fetch="LAZY"> </element-collection> -->
    </attributes>
</mapped-superclass>

<entity class="com.compnay.qube.services.core.user.model.User"
    name="User">
    <table name="USER" />
    <inheritance strategy="JOINED" />
    <named-query name="findUserByUserName">
        <query><![CDATA[select user from User user where 
user.userName = :userName]]></query>
    </named-query>
    <attributes>
        <basic name="userName">
            <column name="USERNAME" length="100" updatable="false"
                unique="false" />
        </basic>
        <basic name="passsword">
            <column name="PASSWORD" length="100" updatable="false"
                unique="false" />
        </basic>
        <basic name="email">
            <column name="EMAIL" length="100" updatable="false" unique="false" />
        </basic>
        <basic name="optIn">
            <column name="OPTIN" updatable="true" unique="false" />
        </basic>
        <one-to-many name="userRoles">
            <join-table name="USER_ROLES">
                <join-column name="USER_ID" />
                <inverse-join-column name="ROLE_ID" />
            </join-table>
            <cascade>
                <cascade-persist />
                <cascade-merge />
                <cascade-refresh />
            </cascade>
        </one-to-many>

    </attributes>
</entity>

<entity class="com.compnay.qube.services.core.user.model.Role"
    name="ROLE">
    <table name="ROLE" />
    <inheritance strategy="JOINED" />
    <named-query name="findByUniqueName">
        <query><![CDATA[select role from ROLE role where role.roleName = :roleName]]></query>
    </named-query>
    <attributes>
        <basic name="roleName">
            <column name="ROLE" length="100" updatable="true" unique="true" />
        </basic>
        <!--<transient name="user" /> -->
        <many-to-one name="user">
            <cascade>
                <cascade-all />
            </cascade>
        </many-to-one>
    </attributes>
</entity>
public void create(M model) throws DAOException {
    try {
        entityManager.persist(model);
    } catch (RollbackException rollBackExp) {
        ErrorCode errorCode = new ErrorCode();
        // SQLException sqle = (SQLException) pExp.getCause().getCause();
        // errorCode = errorHandler.getErrorCode(sqle);
        // errorCode.setCode(sqle.getErrorCode() + "");
        throw new DAOException(errorCode, rollBackExp);
    } catch (PersistenceException pExp) {
        ErrorCode errorCode = new ErrorCode();
        // SQLException sqle = (SQLException) pExp.getCause().getCause();
        // errorCode = errorHandler.getErrorCode(sqle);
        // errorCode.setCode(sqle.getErrorCode() + "");
        throw new DAOException(errorCode, pExp);
    }finally{
        entityManager.flush();
    }
}
                    if(roles.size() == 0){
            Role arole = initRole(RoleType.ADMIN.name(),
                    CREATION_DATE_YESTERDAY, MODIFICATION_DATE_TODAY);
            Role srole = initRole(RoleType.SUPER_USER.name(),
                    CREATION_DATE_YESTERDAY, MODIFICATION_DATE_TODAY);
            Role urole = initRole(RoleType.USER.name(),
                    CREATION_DATE_YESTERDAY, MODIFICATION_DATE_TODAY);

            roles.put(arole.getRoleName(), arole);
            roles.put(srole.getRoleName(), srole);
            roles.put(urole.getRoleName(), urole);
        }
        User user_one = initUser("user" + (i+1) , "user" + (i+1), "user" + (i+1) + "@user.com",
                CREATION_DATE_YESTERDAY, MODIFICATION_DATE_TODAY);


        user_one.setUserRoles(new HashSet<Role>(roles.values()));

        Enumeration<String> roleKeys = roles.keys();
        while(roleKeys.hasMoreElements()){
            String key = roleKeys.nextElement();
            Role role = roles.get(key);
            role.setUser(user_one);
        }

        try {
            userService.create(user_one);
            Set<Role> urole = user_one.getUserRoles();
            for (Role role : urole) {
                roles.put(role.getRoleName(), role);
            }
            //logger.debug(user_one);
        } catch (ServiceException e) {
            e.printStackTrace();
        }
if(roles.size()==0){
Role arole=initRole(RoleType.ADMIN.name(),
创建日期(昨天),修改日期(今天);
Role srole=initRole(RoleType.SUPER\u USER.name(),
创建日期(昨天),修改日期(今天);
Role urole=initRole(RoleType.USER.name(),
创建日期(昨天),修改日期(今天);
roles.put(arole.getRoleName(),arole);
roles.put(srole.getRoleName(),srole);
roles.put(urole.getRoleName(),urole);
}
User User_one=initUser(“User”+(i+1),“User”+(i+1),“User”+(i+1)+“@User.com”,
创建日期(昨天),修改日期(今天);
user_one.setUserRoles(新的HashSet(roles.values());
枚举roleKeys=roles.keys();
while(roleKeys.hasMoreElements()){
String key=roleKeys.nextElement();
Role=roles.get(键);
角色.setUser(user_one);
}
试一试{
userService.create(user\u one);
设置urole=user_one.getUserRoles();
for(角色:urole){
roles.put(role.getRoleName(),role);
}
//logger.debug(用户1);
}捕获(服务异常e){
e、 printStackTrace();
}

它在第二次迭代中引发了一个异常


java.sql.BatchUpdateException:键“ROLE\u ID”的重复条目“3”
错误:org.hibernate.util.jdbceptionReporter-键“ROLE\u ID”的重复条目“3”
org.hibernate.util.jdbceptionReporter-SQL错误:1062,SQLState:23000

有人能指出这段代码有什么问题吗

无法使用批注,因为这是映射各种应用程序中使用的旧代码


您尝试将记录插入表
ROLE
,其中列
ROLE
的值为3。但由于该列在映射中声明为唯一的,并且表
ROLE
中已有一条列
ROLE
=3的记录,因此会引发异常。因此,不要尝试插入第二条列为
角色
=3的记录。我希望ti所做的只是更新已经存在的记录,这就是realtion description下的cascade所做的