JPA关系持久性
我在类路径上使用JPA2和以下JARJPA关系持久性,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
[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所做的