私は tomcat で hibernate に支えられた JPA アプリケーションを開発しています。Spring と AOP も使用しています。データベースは DB2 9.7 コミュニティ エディションです。Tomcat からデータソースを取得するために、Spring JNDI ルックアップを使用しています。
これは、Liferay ポータルにバンドルされている tomcat 6.0.26 です。Liferay を新しいバージョン / バンドルにアップグレードする際に問題があるため、Tomcat の更新はオプションではありません。
私たちのテストケースでは永続化は問題なく実行されていますが、Tomcat では次の例外が発生します。添付ファイルを保存したいところまで、アプリケーションはうまく機能します。
Caused by: java.lang.AbstractMethodError: org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.setBinaryStream(ILjava/io/InputStream;J)V
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:122)
at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81)
at $Proxy432.setBinaryStream(Unknown Source)
at org.hibernate.type.descriptor.sql.BlobTypeDescriptor$4$1.doBind(BlobTypeDescriptor.java:163)
他の質問を見るdb に blob をロードしようとすると java.lang.AbstractMethodError が発生するのはなぜですか? 問題は、jdbc4 ドライバーの代わりに jdbc3 ドライバーが使用されているようです。ただし、正しい DB2 ドライバー バージョン「db2jcc4.jar 4.14.113」があることを確認しました。テストケースでも同じドライバーが機能します。
他の場所を検索すると、問題は setBinaryStream が int ではなく long で呼び出されることですが、直接何も呼び出さないため、それを変更することはできません。
問題のエンティティ:
@Table( name = "ATTACHMENT")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(namespace = "somenamespace", name = "Attachment")
public class Attachment implements Serializable {
private static final long serialVersionUID = 1L;
/**
*/
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID", nullable = false)
@Basic(fetch = FetchType.EAGER)
@Id
@XmlElement
Integer id;
/**
*/
@Column(name = "ATTACHMENT", nullable = false)
@Basic(fetch = FetchType.EAGER)
@Lob
@XmlElement
byte[] attachment;
.. getters/setters and other properties
}
テストケースのようにエンティティを保存するために問題を回避するにはどうすればよいですか?
更新:おそらく db ドライバー自体ではありませんが、Tomcat 接続プールは JDBC4 に準拠していません。Tomcat 6のドキュメントには、「DBCP 1.3 は JDBC 3.0 のサポートを提供します」と記載されています。tomcat-dbcp と commons-dbcpを見ると、プレーンな dbcp と交換するのは得策ではないようです。