Had this problem. You need two things: NVARCHAR2 columns and an oracle specific method call on the preparedstatement to notify oracle about the string encoding:
/**
* Sets a statement parameter as NCHAR. Use before setting the field value.
* @param pstmt the prepared statement
* @param index the parameter index
*/
public static void setNChar(PreparedStatement pstmt, int index) {
OraclePreparedStatement opstmt = (OraclePreparedStatement)pstmt;
opstmt.setFormOfUse(index, OraclePreparedStatement.FORM_NCHAR);
}
If you use plain SQL string with unicode characters, that works as Oracle gets all SQL commands in UTF-8: the driver automatically translates. However, for prepared statement use you need to explicitely tell that to oracle.
You could also try PreparedStatement.setNString() if you run Java 6 and have ojdbc6 driver. (In my case we had to use Java 5 with version 4 driver - don't ask why)
(Note: I know this is vendor lock-in as you are forced to use concrete oracle classes instead of the jdbc interfaces)