2013-06-25 47 views
4

Hibernate映射我已經在我的數據庫下表與@Any和@JoinTable

IMAGE_TABLE { 
    `ID` 
    `NAME` 
} 

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

CAR { 
    `ID` 
    `DESCRIPTION` 
} 

HOUSE { 
    `ID` 
    `DESCRIPTION` 
} 

IMAGE_OBJECT錶鏈接圖像要麼買房買車(取決於OBJECT_TYPE值)。 在我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

我結束了最後一個映射,以下列方式寫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); 
    } 
} 
+1

它仍然是一個討厭的黑客攻擊。希望有人可以對此發表評論,目前有相同的問題:/ – test

+1

同一個這裏... = T –