有 Java 编程相关的问题?

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

java hibernate与@Any和@JoinTable的映射

我的数据库中有以下表格

IMAGE_TABLE {
   `ID`
   `NAME`
}

IMAGE_OBJECT {
   `IMAGE_ID`
   `OBJECT_ID`
   `OBJECT_TYPE`
}

CAR {
   `ID`
   `DESCRIPTION`
}

HOUSE {
   `ID`
   `DESCRIPTION`
}

图像\对象表将图像链接到汽车或房屋(取决于对象\类型值)。 在我的ImageEntity中,我想用单个实体映射字段:

    @Any(
        metaColumn = @Column( table="IMAGE_OBJECT", name = "OBJECT_TYPE" ) )
    @AnyMetaDef(
        idType = "long",
        metaType = "string",
        metaValues = {
            @MetaValue( value = "car", targetEntity = CarEntity.class ),
            @MetaValue( value = "house", targetEntity = HouseEntity.class )
        } 
    )
    @JoinTable(name = "IMAGE_OBJECT",
        joinColumns = {
            @JoinColumn(name = "IMAGE_ID", unique = true)           
        },
        inverseJoinColumns = {
            @JoinColumn(name = "OBJECT_ID")
        }     
    )
    private AbstractEntity object;

但这种映射导致了例外情况:

org.hibernate.AnnotationException: @Any requires an explicit @JoinColumn(s)

我还尝试使用@ManyToAny映射,然后使用setter和getter在集合中存储单个元素:

    @ManyToAny(
        metaColumn = @Column( table="IMAGE_OBJECT", name = "OBJECT_TYPE" ) )
    @AnyMetaDef(
        idType = "long",
        metaType = "string",
        metaValues = {
            @MetaValue( value = "car", targetEntity = CarEntity.class ),
            @MetaValue( value = "house", targetEntity = HouseEntity.class )
        } 
    )
    @JoinTable(name = "IMAGE_OBJECT",
        joinColumns = {
            @JoinColumn(name = "IMAGE_ID", unique = true)           
        },
        inverseJoinColumns = {
            @JoinColumn(name = "OBJECT_ID")
        }     
    )
    private Set<AbstractEntity> objects;

除非我尝试清除objects或从中删除一个元素,否则这是有效的:

objects.clear();

给我一个奇怪的例外:

org.springframework.orm.hibernate3.HibernateJdbcException: JDBC exception on Hibernate data access: SQLException for SQL [delete from IMAGE_OBJECT where IMAGE_ID=? and OBJECT_ID=?];
...
Caused by: java.sql.SQLException: Parameter index out of range (3 > number of parameters, which is 2).

这可能是一个bug in Hibernate,所以我也不能使用这个映射

是否有任何方法可以使用@JoinTable映射任何关系


共 (1) 个答案

  1. # 1 楼答案

    我以最后一个映射结束,并以以下方式编写setter和getter:

    ...
    private Set<AbstractEntity> objects = new HashSet<AbstractEntity>();
    
    ...
    
    public AbstractEntity getObject() {
        return objects.isEmpty() ? null : objects.get(0);
    }
    
    public void setObject(AbstractEntity object) {
        // objects.clear() results in weird exception
        objects = new HashSet<AbstractEntity>();
        if (object != null) {
            objects.add(object);
        }
    }