有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使Hibernate使用自定义集合类型

我正在为hibernate迁移一个自动化预取的工具,这个工具使用自定义集合,换句话说,自定义类扩展hibernate已经存在的集合,例如PersistentSet。我的问题是,我不明白如何让hibernate在返回结果时使用我的自定义集合类。我正在为映射使用注释

其中一个包装器类如下所示:

public class AutofetchSet extends PersistentSet implements Trackable {

private CollectionTracker collectionTracker = new CollectionTracker();

public AutofetchSet() {
    super();
}

public AutofetchSet(SessionImplementor si, Set s) {
    super(si, s);
}

public AutofetchSet(SessionImplementor si) {
    super(si);
}

public void addTracker(Statistics tracker) {
    collectionTracker.addTracker(tracker);
}

public void addTrackers(Set<Statistics> trackers) {
    collectionTracker.addTrackers(trackers);
}

public boolean disableTracking() {
    boolean oldValue = collectionTracker.isTracking();
    collectionTracker.setTracking(false);
    return oldValue;
}

public boolean enableTracking() {
    boolean oldValue = collectionTracker.isTracking();
    collectionTracker.setTracking(true);
    return oldValue;
}

public void removeTracker(Statistics stats) {
    collectionTracker.removeTracker(stats);
}

private void accessed() {
    if (wasInitialized()) {
        collectionTracker.trackAccess(set);
    }
}

/**
 * @see java.util.Set#size()
 */
@Override
public int size() {
    int ret = super.size();
    if (wasInitialized()) {
        accessed();
    }
    return ret;
}

/**
 * @see java.util.Set#isEmpty()
 */
@Override
public boolean isEmpty() {
    boolean ret = super.isEmpty();
    if (wasInitialized()) {
        accessed();
    }
    return ret;
}

/**
 * @see java.util.Set#contains(Object)
 */
@Override
public boolean contains(Object object) {
    boolean ret = super.contains(object);
    if (wasInitialized()) {
        accessed();
    }
    return ret;
}

/**
 * @see java.util.Set#iterator()
 */
@Override
public Iterator iterator() {
    Iterator iter = super.iterator();
    if (wasInitialized()) {
        accessed();
    }
    return iter;
}

/**
 * @see java.util.Set#toArray()
 */
@Override
public Object[] toArray() {
    Object[] arr = super.toArray();
    if (wasInitialized()) {
        accessed();
    }
    return arr;
}

/**
 * @see java.util.Set#toArray(Object[])
 */
@Override
public Object[] toArray(Object[] array) {
    Object[] arr = super.toArray(array);
    if (wasInitialized()) {
        accessed();
    }
    return arr;
}

/**
 * @see java.util.Set#add(Object)
 */
@Override
public boolean add(Object value) {
    Boolean exists = isOperationQueueEnabled()
            ? readElementExistence(value) : null;
    if (exists == null) {
        initialize(true);
        accessed();
        if (set.add(value)) {
            dirty();
            return true;
        } else {
            return false;
        }
    } else {
        return super.add(value);
    }
}

/**
 * @see java.util.Set#remove(Object)
 */
@Override
public boolean remove(Object value) {
    boolean ret = super.remove(value);
    if (wasInitialized()) {
        accessed();
    }
    return ret;
}

/**
 * @see java.util.Set#containsAll(Collection)
 */
@Override
public boolean containsAll(Collection coll) {
    boolean ret = super.containsAll(coll);
    if (wasInitialized()) {
        accessed();
    }
    return ret;
}

/**
 * @see java.util.Set#addAll(Collection)
 */
@Override
public boolean addAll(Collection coll) {
    if (coll.size() > 0) {
        initialize(true);
        accessed();
        if (set.addAll(coll)) {
            dirty();
            return true;
        } else {
            return false;
        }
    } else {
        return false;
    }
}

/**
 * @see java.util.Set#retainAll(Collection)
 */
@Override
public boolean retainAll(Collection coll) {
    boolean val = super.retainAll(coll);
    if (wasInitialized()) {
        accessed();
    }
    return val;
}

/**
 * @see java.util.Set#removeAll(Collection)
 */
@Override
public boolean removeAll(Collection coll) {
    boolean val = super.removeAll(coll);
    if (wasInitialized()) {
        accessed();
    }
    return val;
}

@Override
public void clear() {
    super.clear();
    if (wasInitialized()) {
        accessed();
    }
}

@Override
public String toString() {
    //if (needLoading) return "asleep";
    String ret = super.toString();
    if (wasInitialized()) {
        accessed();
    }
    return ret;
}

@Override
public boolean equals(Object other) {
    boolean ret = super.equals(other);
    if (wasInitialized()) {
        accessed();
    }
    return ret;
}

@Override
public int hashCode() {
    int ret = super.hashCode();
    if (wasInitialized()) {
        accessed();
    }
    return ret;
}

public boolean isAccessed() {
    return collectionTracker.isAccessed();
}

这是我扩展的类型类:

public class AutofetchSetType extends SetType {

public AutofetchSetType(TypeScope typeScope, String role, String propertyRef) {
    super(typeScope, role, propertyRef);

}
@Override
public PersistentCollection instantiate(SessionImplementor session,
        CollectionPersister persister, Serializable key) {
        return new AutofetchSet(session);
}

@Override
public PersistentCollection wrap(SessionImplementor session,
        Object collection) {
        return new AutofetchSet(session, (java.util.Set) collection);
}

如果有人对此有所了解,我们将不胜感激


共 (0) 个答案