Java 无法阻止jdbc驱动程序默认为LONG、OracleDB
问题是,当我有一个中等大小的4+字符的文件,但低于大约10k'ish。 然后驱动程序会将我的字符串默认为长字符串,这将导致以下错误: ORA-01461:只能为插入到长列中绑定长值 发现字符串大小在4k和40k之间时出错 我尝试了很多方法来改变这一点,但似乎没有任何效果。我真的希望有人能帮助我 以下是控制器类:Java 无法阻止jdbc驱动程序默认为LONG、OracleDB,java,oracle,hibernate,clob,Java,Oracle,Hibernate,Clob,问题是,当我有一个中等大小的4+字符的文件,但低于大约10k'ish。 然后驱动程序会将我的字符串默认为长字符串,这将导致以下错误: ORA-01461:只能为插入到长列中绑定长值 发现字符串大小在4k和40k之间时出错 我尝试了很多方法来改变这一点,但似乎没有任何效果。我真的希望有人能帮助我 以下是控制器类: @RequestMapping(value = "/uploadFile/{companiesId}/{day}/{month}/{year}/{userId}/{orgId}",
@RequestMapping(value = "/uploadFile/{companiesId}/{day}/{month}/{year}/{userId}/{orgId}",
method = RequestMethod.POST, headers = "Accept=*")
public void uploadFile(@PathVariable("companiesId") int companiesId,
@PathVariable("day") int day, @PathVariable("month") int month,
@PathVariable("year") int year, @PathVariable("userId") int userId,
@RequestParam(value = "file") MultipartFile multipartFile,
Model model, HttpServletRequest request, HttpServletResponse response, @PathVariable("orgId") Integer orgId) {
Calendar date = Calendar.getInstance();
date.set(Calendar.YEAR, year);
date.set(year, month - 1, day);
System.out.println("date: " + date.getTime());
String fileName = multipartFile.getOriginalFilename();
String fileContent = null;
try {
InputStream is = multipartFile.getInputStream();
byte[] bytes = IOUtils.toByteArray(is);
String fileData = new String(bytes);
fileContent = fileData ;
} catch (IOException ex) {
java.util.logging.Logger.getLogger(HomeController.class.getName()).log(Level.SEVERE, null, ex);
throw new RuntimeException(ex);
}
Session session = sessionFactory.openSession();
long insertedFileId = -1;
Transaction t = session.beginTransaction();
t.begin();
if (fileContent != null) {
ImportFile file = new ImportFile();
file.setFileDate(date.getTime());
file.setFileName(fileName);
file.setContent(fileContent);
file.setChangedBy(userId);
file.setCreatedBy(userId);
file.setCompaniesId(companiesId);
file.setOrgId(orgId);
session.persist(file);
insertedFileId = file.getId();
}
t.commit();
}
以下是实体类:
@Id
@Column(name = "IMPORT_COST_FILES_ID")
@GeneratedValue(strategy = GenerationType.AUTO, generator = "WHMOD_SEQ")
@SequenceGenerator(name = "WHMOD_SEQ", sequenceName = "warehouse.WHMOD_SEQ")
private Long id;
@Column(name = "FILE_NAME")
private String fileName;
@Column(name = "COMPANIES_ID")
private Integer companiesId;
@Column(name = "CHANGED_BY")
private Integer changedBy;
@Column(name = "CREATED_BY")
private Integer createdBy;
@Column(name = "FILE_CONTENT")
@Lob
private String content;
@Column(name = "File_date")
@Temporal(javax.persistence.TemporalType.DATE)
private Date fileDate;
@Column(name = "ORG_ID")
private Integer orgId;
}
以下是相关的POM.xml信息:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>3.6.0.Final</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<version>1.8.0.10</version>
</dependency>
<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.0-api</artifactId>
<version>1.0.0.Final</version>
<scope>compile</scope>
</dependency>
<!-- Persistence Dependencies -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>3.3.2.GA</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-annotations</artifactId>
<version>3.3.1.GA</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-commons-annotations</artifactId>
<version>3.3.0.ga</version>
</dependency>
数据库驱动程序版本:
DatabaseMetaData=session.connection.getMetaData;=版本:10.2.0.3.0您使用的确切Oracle版本是什么?JDBC驱动程序的版本是什么?文件名中的数字不是驱动程序版本,而是预期的Java版本。问题表的CREATETABLE语句是什么?我如何看到驱动程序版本?create table语句将以秒的形式出现,要么调用DatabaseMetaData.getDriverVersion,要么查看jar中的MANIFEST.MF-较新的版本中有驱动程序版本。我已经尝试过了,结果是相同的错误,实际上我已经恢复到该错误。对于二进制数据或字符[],AFAIK@Lob应该放在字节[]或字节[]上或字符数据的字符串。它不应该是Clob类型。
<?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:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<description>Example configuration to get you started.</description>
<jee:jndi-lookup id="datasource" jndi-name="jdbc/LogisticsUserCoreDS"/>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="datasource" />
<property name="packagesToScan" value="dk.org.importcost.domain" />
<property name="schemaUpdate" value="false" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory
</prop>
<prop key="hibernate.auto-import">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</prop>
</props>
</property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
<context:component-scan base-package="dk.org.importcost.domain"/>
</beans>
CREATE TABLE "WAREHOUSE"."IMPORT_COST_FILES"
( "IMPORT_COST_FILES_ID" NUMBER(10,0) NOT NULL ENABLE,
"FILE_NAME" VARCHAR2(80 BYTE) NOT NULL ENABLE,
"FILE_DATE" DATE NOT NULL ENABLE,
"FILE_CONTENT" CLOB,
"STATUS_TYPES_ID" NUMBER(10,0),
"COMPANIES_ID" NUMBER(10,0) NOT NULL ENABLE,
"DELETED" VARCHAR2(1 BYTE) DEFAULT 'N',
"CREATED_BY" NUMBER(10,0) NOT NULL ENABLE,
"CREATED_DATE" DATE NOT NULL ENABLE,
"CHANGED_BY" NUMBER(10,0),
"CHANGED_DATE" DATE,
"ERROR_MSG" VARCHAR2(100 BYTE),
"ORG_ID" NUMBER(10,0),
CONSTRAINT "IMPORT_COST_FILES_PK" PRIMARY KEY ("IMPORT_COST_FILES_ID")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 1048576 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "INDX" ENABLE,
CONSTRAINT "WHICF_USERS_FK_1" FOREIGN KEY ("CREATED_BY")
REFERENCES "SYSMODULE"."USERS" ("USERS_ID") ENABLE,
CONSTRAINT "WHICF_COMP_FK" FOREIGN KEY ("COMPANIES_ID")
REFERENCES "SYSMODULE"."COMPANIES" ("COMPANIES_ID") ENABLE,
CONSTRAINT "WHICF_USERS_FK_2" FOREIGN KEY ("CHANGED_BY")
REFERENCES "SYSMODULE"."USERS" ("USERS_ID") ENABLE,
CONSTRAINT "WHICF_STATYP_FK" FOREIGN KEY ("STATUS_TYPES_ID")
REFERENCES "LOGISTICS"."STATUS_TYPES" ("STATUS_TYPES_ID") ENABLE,
CONSTRAINT "IMPCOST_COMP_FK" FOREIGN KEY ("ORG_ID")
REFERENCES "SYSMODULE"."COMPANIES" ("COMPANIES_ID") ENABLE
) SEGMENT CREATION IMMEDIATE
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
NOCOMPRESS LOGGING
STORAGE(INITIAL 1048576 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "DATA"
LOB ("FILE_CONTENT") STORE AS BASICFILE (
TABLESPACE "DATA" ENABLE STORAGE IN ROW CHUNK 8192 RETENTION
NOCACHE LOGGING
STORAGE(INITIAL 1048576 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)) ;