Новичок
Профиль
Группа: Участник
Сообщений: 8
Регистрация: 24.4.2008
Репутация: нет Всего: нет
|
Всем привет. В общем такая проблема. В прилаге используются OpenJPA и MSSQL Файл persistense.xml имеет вид | Код | <?xml version="1.0" encoding="UTF-8" ?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">
<persistence-unit name="testPersistenceUnit" transaction-type="JTA"> <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider> <class>com.domain.object.Employee</class> <properties> <property name="openjpa.ConnectionURL" value="jdbc:sqlserver://localhost:1433;DatabaseName=test;selectMethod=cursor" /> <property name="openjpa.ConnectionDriverName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" /> <property name="openjpa.ConnectionUserName" value="test" /> <property name="openjpa.ConnectionPassword" value="123456" /> <property name="openjpa.jdbc.Schema" value="dbo" /> </properties> </persistence-unit>
</persistence>
|
Создал простейшую Entity | Код | @Entity @Table(name = "TEST_EMPLOYEE") public class Employee extends BaseDomainObject<Long> {
/** The Constant serialVersionUID. */ private static final long serialVersionUID = 7836236100107721665L;
/** The name. */ @Column(name = "NAME") private String name;
/** The surname. */ @Column(name = "SURNAME") private String surname;
/** The age. */ @Column(name = "AGE") private int age;
/** * Instantiates a new employee. * * @param name * the name * @param surname * the surname * @param age * the age */ public Employee(String name, String surname, int age) { this.name = name; this.surname = surname; this.age = age; }
/** * Instantiates a new employee. */ public Employee() { }
/** * Gets the name. * * @return the name */ public String getName() { return name; }
/** * Sets the name. * * @param name * the new name */ public void setName(String name) { this.name = name; }
/** * Gets the surname. * * @return the surname */ public String getSurname() { return surname; }
/** * Sets the surname. * * @param surname * the new surname */ public void setSurname(String surname) { this.surname = surname; }
/** * Gets the age. * * @return the age */ public int getAge() { return age; }
/** * Sets the age. * * @param age * the new age */ public void setAge(int age) { this.age = age; } }
|
класс, который экстендится | Код | @MappedSuperclass public abstract class BaseDomainObject<T extends Serializable> implements Serializable {
/** The Constant ID_ATTRIBUTE. */ public static final String ID_ATTRIBUTE = "id";
/** The Constant serialVersionUID. */ private static final long serialVersionUID = 2766297120520826103L;
/** The id. */ @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "ID", nullable = false) private T id;
/** * Gets the id. * * @return the id */ public T getId() { return this.id; }
/** * Sets the id. * * @param id * the new id */ public void setId(T id) { this.id = id; }
/** * Gets hash code. * * @return the int */ @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((this.id == null) ? 0 : this.id.hashCode()); return result; }
/** * Check if equals. * * @param obj * the obj * @return true, if successful */ @Override @SuppressWarnings("unchecked") public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (this.getClass() != obj.getClass()) { return false; } BaseDomainObject<T> other = (BaseDomainObject<T>) obj; if (this.id == null) { if (other.id != null) { return false; } } else if (!this.id.equals(other.id)) { return false; } return true; }
}
|
xml-ники Context-a | Код | <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<import resource="applicationContextPersistenceJPA.xml" /> <import resource="applicationContextPersistenceTransaction.xml" />
</beans>
|
| Код | <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="persistenceXmlLocation" value="classpath:/META-INF/persistence.xml" /> <property name="jpaDialect" ref="jpaDialect" /> <property name="persistenceUnitName" value="infobankBsPersistenceUnit" /> <property name="jpaVendorAdapter" ref="jpaVendorAdapter" /> <property name="loadTimeWeaver"> <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" /> </property> </bean>
<bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.OpenJpaDialect" />
<bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.OpenJpaVendorAdapter"> <property name="showSql" value="true" /> <property name="generateDdl" value="true" /> </bean> </beans>
|
| Код | <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory" /> <property name="jpaDialect" ref="jpaDialect" /> <property name="persistenceUnitName" value="testPersistenceUnit" /> </bean>
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="false" />
</beans>
|
Теперь суть проблемы. В базу объект инсертится, но когда пытаюсь вызвать | Код | public List<T> findAll() { CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); CriteriaQuery<T> query = criteriaBuilder.createQuery(type); Root<T> root = query.from(type); query.select(root); TypedQuery<T> typedQuery = entityManager.createQuery(query); return typedQuery.getResultList(); }
|
(Класс - генерик, то есть T=Employee, type = Employee.class) Primary Key достается мз базы как Binary Object. То есть, в OpenJPA есть класс DBDictionary и в нем метод | Код | public void setTyped(PreparedStatement stmnt, int idx, Object val, Column col, int type, JDBCStore store) throws SQLException { if (val == null) { setNull(stmnt, idx, (col == null) ? Types.OTHER : col.getType(), col); return; }
Sized s; Calendard c; switch (type) { case JavaTypes.BOOLEAN: case JavaTypes.BOOLEAN_OBJ: setBoolean(stmnt, idx, ((Boolean) val).booleanValue(), col); break; case JavaTypes.BYTE: case JavaTypes.BYTE_OBJ: setByte(stmnt, idx, ((Number) val).byteValue(), col); break; case JavaTypes.CHAR: case JavaTypes.CHAR_OBJ: setChar(stmnt, idx, ((Character) val).charValue(), col); break; case JavaTypes.DOUBLE: case JavaTypes.DOUBLE_OBJ: setDouble(stmnt, idx, ((Number) val).doubleValue(), col); break; case JavaTypes.FLOAT: case JavaTypes.FLOAT_OBJ: setFloat(stmnt, idx, ((Number) val).floatValue(), col); break; case JavaTypes.INT: case JavaTypes.INT_OBJ: setInt(stmnt, idx, ((Number) val).intValue(), col); break; case JavaTypes.LONG: case JavaTypes.LONG_OBJ: setLong(stmnt, idx, ((Number) val).longValue(), col); break; case JavaTypes.SHORT: case JavaTypes.SHORT_OBJ: setShort(stmnt, idx, ((Number) val).shortValue(), col); break; case JavaTypes.STRING: if (col != null && (col.getType() == Types.CLOB || col.getType() == Types.LONGVARCHAR)) setClobString(stmnt, idx, (String) val, col); else { if (val instanceof String) setString(stmnt, idx, (String) val, col); else setString(stmnt, idx, val.toString(), col); } break; case JavaTypes.OBJECT: setBlobObject(stmnt, idx, val, col, store); break; case JavaTypes.DATE: setDate(stmnt, idx, (Date) val, col); break; case JavaTypes.CALENDAR: setCalendar(stmnt, idx, (Calendar) val, col); break; case JavaTypes.BIGDECIMAL: setBigDecimal(stmnt, idx, (BigDecimal) val, col); break; case JavaTypes.BIGINTEGER: setBigInteger(stmnt, idx, (BigInteger) val, col); break; case JavaTypes.NUMBER: setNumber(stmnt, idx, (Number) val, col); break; case JavaTypes.LOCALE: setLocale(stmnt, idx, (Locale) val, col); break; case JavaSQLTypes.SQL_ARRAY: setArray(stmnt, idx, (Array) val, col); break; case JavaSQLTypes.ASCII_STREAM: s = (Sized) val; setAsciiStream(stmnt, idx, (InputStream) s.value, s.size, col); break; case JavaSQLTypes.BINARY_STREAM: s = (Sized) val; setBinaryStream(stmnt, idx, (InputStream) s.value, s.size, col); break; case JavaSQLTypes.BLOB: setBlob(stmnt, idx, (Blob) val, col); break; case JavaSQLTypes.BYTES: setBytes(stmnt, idx, (byte[]) val, col); break; case JavaSQLTypes.CHAR_STREAM: s = (Sized) val; setCharacterStream(stmnt, idx, (Reader) s.value, s.size, col); break; case JavaSQLTypes.CLOB: setClob(stmnt, idx, (Clob) val, col); break; case JavaSQLTypes.SQL_DATE: if (val instanceof Calendard) { c = (Calendard) val; setDate(stmnt, idx, (java.sql.Date) c.value, c.calendar, col); } else setDate(stmnt, idx, (java.sql.Date) val, null, col); break; case JavaSQLTypes.REF: setRef(stmnt, idx, (Ref) val, col); break; case JavaSQLTypes.TIME: if (val instanceof Calendard) { c = (Calendard) val; setTime(stmnt, idx, (Time) c.value, c.calendar, col); } else setTime(stmnt, idx, (Time) val, null, col); break; case JavaSQLTypes.TIMESTAMP: if (val instanceof Calendard) { c = (Calendard) val; setTimestamp(stmnt, idx, (Timestamp) c.value, c.calendar, col); } else setTimestamp(stmnt, idx, (Timestamp) val, null, col); break; default: if (col != null && (col.getType() == Types.BLOB || col.getType() == Types.VARBINARY)) setBlobObject(stmnt, idx, val, col, store); else setObject(stmnt, idx, val, col.getType(), col); } }
|
то есть в соплях из switch поле ID (да и все последующие) представляется как JavaTypes.OBJECT (соответственно пытается десеарилизовать его :-( ). Валится эксепшн | Код | Caused by: javax.ejb.EJBException: See nested exception; nested exception is: <openjpa-2.0.2-SNAPSHOT-r422266:1084264 nonfatal general error> org.apache.openjpa.persistence.PersistenceException: invalid stream header: 00000016 Caused by: <openjpa-2.0.2-SNAPSHOT-r422266:1084264 nonfatal general error> org.apache.openjpa.persistence.PersistenceException: invalid stream header: 00000016 at org.apache.openjpa.util.Serialization.deserialize(Serialization.java:88) at org.apache.openjpa.jdbc.sql.DBDictionary.getBlobObject(DBDictionary.java:620) at org.apache.openjpa.jdbc.sql.ResultSetResult.getObjectInternal(ResultSetResult.java:402) at org.apache.openjpa.jdbc.sql.AbstractResult.getObject(AbstractResult.java:696) at org.apache.openjpa.jdbc.meta.strats.HandlerFieldStrategy.getPrimaryKeyValue(HandlerFieldStrategy.java:322) at org.apache.openjpa.jdbc.meta.ClassMapping.getObjectId(ClassMapping.java:187) at org.apache.openjpa.jdbc.meta.ClassMapping.getObjectId(ClassMapping.java:146) at org.apache.openjpa.jdbc.kernel.JDBCStoreManager.load(JDBCStoreManager.java:1020) at com.ibm.ws.persistence.jdbc.kernel.WsJpaJDBCStoreManager.load(WsJpaJDBCStoreManager.java:110) at org.apache.openjpa.jdbc.sql.AbstractResult.load(AbstractResult.java:280) at org.apache.openjpa.jdbc.sql.SelectImpl$SelectResult.load(SelectImpl.java:2344) at org.apache.openjpa.jdbc.sql.AbstractResult.load(AbstractResult.java:274) at org.apache.openjpa.jdbc.kernel.InstanceResultObjectProvider.getResultObject(InstanceResultObjectProvider.java:59) at org.apache.openjpa.kernel.QueryImpl$PackingResultObjectProvider.getResultObject(QueryImpl.java:2073) at org.apache.openjpa.lib.rop.EagerResultList.<init>(EagerResultList.java:36) at org.apache.openjpa.kernel.QueryImpl.toResult(QueryImpl.java:1246) at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:1005) at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:861) at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:792) at org.apache.openjpa.kernel.DelegatingQuery.execute(DelegatingQuery.java:542) at org.apache.openjpa.persistence.QueryImpl.execute(QueryImpl.java:288) at org.apache.openjpa.persistence.QueryImpl.getResultList(QueryImpl.java:302) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:48) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:600) at org.springframework.orm.jpa.SharedEntityManagerCreator$DeferredQueryInvocationHandler.invoke(SharedEntityManagerCreator.java:310) at $Proxy52.getResultList(Unknown Source) at ru.sbrf.infobank.persistence.dao.impl.BaseDomainObjectDAOImpl.findAll(BaseDomainObjectDAOImpl.java:133) at ru.sbrf.infobank.bs.bills.business.service.impl.EmployeeServiceImpl.testEmployee(EmployeeServiceImpl.java:33) at ru.sbrf.infobank.bs.bills.integration.service.impl.TestIntegrationServiceImpl.testEmployee(TestIntegrationServiceImpl.java:46) at ru.sbrf.infobank.bs.bills.integration.service.EJSRemote0SLTestIntegrationServiceImpl_b6049406.testEmployee(EJSRemote0SLTestIntegrationServiceImpl_b6049406.java) at ru.sbrf.infobank.bs.bills.integration.service._ITestIntegrationService_Stub.testEmployee(_ITestIntegrationService_Stub.java) at ru.sbrf.infobank.bs.bills.presentation.server.service.impl.UserServiceImpl.register(UserServiceImpl.java:65) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:48) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:600) at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:569) at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:208) at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248) at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62) at javax.servlet.http.HttpServlet.service(HttpServlet.java:738) at javax.servlet.http.HttpServlet.service(HttpServlet.java:831) at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1657) at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:939) at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:502) at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:181) at com.ibm.ws.webcontainer.servlet.CacheServletWrapper.handleRequest(CacheServletWrapper.java:91) at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:864) at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1592) at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:186) at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:452) at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewRequest(HttpInboundLink.java:511) at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.processRequest(HttpInboundLink.java:305) at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.ready(HttpInboundLink.java:276) at com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.sendToDiscriminators(NewConnectionInitialReadCallback.java:214) at com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.complete(NewConnectionInitialReadCallback.java:113) at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:165) at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217) at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161) at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138) at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204) at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775) at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:905) at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1613) Caused by: java.io.StreamCorruptedException: invalid stream header: 00000016 at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:786) at java.io.ObjectInputStream.<init>(ObjectInputStream.java:283) at org.apache.openjpa.util.Serialization$ClassResolvingObjectInputStream.<init>(Serialization.java:127) at org.apache.openjpa.util.Serialization$PersistentObjectInputStream.<init>(Serialization.java:161) at org.apache.openjpa.util.Serialization.deserialize(Serialization.java:86) ... 65 more
|
00000016 = 22 в десятичной. ID поднимаемого объекта. Может, есть какая-нибудь пропертя, универсальный конвертер или еще что-либо. В JPA не особо силен  Спасибо заранее
|