001/*
002 * Copyright 2002-2012 the original author or authors.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *      https://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016
017package org.springframework.orm.hibernate3.support;
018
019import java.sql.PreparedStatement;
020import java.sql.ResultSet;
021import java.sql.SQLException;
022import java.sql.Types;
023import java.util.Arrays;
024import javax.transaction.TransactionManager;
025
026import org.springframework.jdbc.support.lob.LobCreator;
027import org.springframework.jdbc.support.lob.LobHandler;
028
029/**
030 * Hibernate UserType implementation for byte arrays that get mapped to BLOBs.
031 * Retrieves the LobHandler to use from LocalSessionFactoryBean at config time.
032 *
033 * <p>Can also be defined in generic Hibernate mappings, as DefaultLobCreator will
034 * work with most JDBC-compliant database drivers. In this case, the field type
035 * does not have to be BLOB: For databases like MySQL and MS SQL Server, any
036 * large enough binary type will work.
037 *
038 * @author Juergen Hoeller
039 * @since 1.2
040 * @see org.springframework.orm.hibernate3.LocalSessionFactoryBean#setLobHandler
041 * @deprecated as of Spring 4.3, in favor of Hibernate 4.x/5.x
042 */
043@Deprecated
044public class BlobByteArrayType extends AbstractLobType  {
045
046        /**
047         * Constructor used by Hibernate: fetches config-time LobHandler and
048         * config-time JTA TransactionManager from LocalSessionFactoryBean.
049         * @see org.springframework.orm.hibernate3.LocalSessionFactoryBean#getConfigTimeLobHandler
050         * @see org.springframework.orm.hibernate3.LocalSessionFactoryBean#getConfigTimeTransactionManager
051         */
052        public BlobByteArrayType() {
053                super();
054        }
055
056        /**
057         * Constructor used for testing: takes an explicit LobHandler
058         * and an explicit JTA TransactionManager (can be {@code null}).
059         */
060        protected BlobByteArrayType(LobHandler lobHandler, TransactionManager jtaTransactionManager) {
061                super(lobHandler, jtaTransactionManager);
062        }
063
064        @Override
065        public int[] sqlTypes() {
066                return new int[] {Types.BLOB};
067        }
068
069        @Override
070        public Class<?> returnedClass() {
071                return byte[].class;
072        }
073
074        @Override
075        public boolean isMutable() {
076                return true;
077        }
078
079        @Override
080        public boolean equals(Object x, Object y) {
081                return (x == y) ||
082                                (x instanceof byte[] && y instanceof byte[] && Arrays.equals((byte[]) x, (byte[]) y));
083        }
084
085        @Override
086        public Object deepCopy(Object value) {
087                if (value == null) {
088                        return null;
089                }
090                byte[] original = (byte[]) value;
091                byte[] copy = new byte[original.length];
092                System.arraycopy(original, 0, copy, 0, original.length);
093                return copy;
094        }
095
096        @Override
097        protected Object nullSafeGetInternal(
098                        ResultSet rs, String[] names, Object owner, LobHandler lobHandler)
099                        throws SQLException {
100
101                return lobHandler.getBlobAsBytes(rs, names[0]);
102        }
103
104        @Override
105        protected void nullSafeSetInternal(
106                        PreparedStatement ps, int index, Object value, LobCreator lobCreator)
107                        throws SQLException {
108
109                lobCreator.setBlobAsBytes(ps, index, (byte[]) value);
110        }
111
112}