2014-12-31 69 views
0

我的應用程序試圖保存一個Project對象和一個Photo對象,它是一個MediaPhoto表中有media_id作爲外鍵。保存Hibernate時出錯繼承

我的類

Project.java

@Entity 
@Table(name = "tbl_project", catalog = "chetak") 
public class Project implements java.io.Serializable { 

private Long projectId; 
private String projectName; 
private Set<Media> projectMedias = new HashSet<Media>(0); 

@OneToMany(fetch = FetchType.EAGER) 
@Cascade({CascadeType.SAVE_UPDATE}) 
public Set<Media> getProjectMedias() { 
    return this.projectMedias; 
} 

public void setProjectMedias(Set<Media> projectMedias) { 
    this.projectMedias = projectMedias; 
} 

Media.java

@Entity 
@Table(name = "tbl_media", catalog = "chetak") 
@Inheritance(strategy=InheritanceType.JOINED) 
public class Media implements java.io.Serializable { 

private Integer mediaId; 
private String type; 
private String mime; 

Photo.java

@Entity 
@Table(name = "tbl_photo", catalog = "chetak") 
@PrimaryKeyJoinColumn(name="mediaId") 
public class Photo extends Media implements java.io.Serializable { 

//private Integer photoId; 
private Integer height; 
private Integer width; 
private String photoType; 

在主類中,我將一張照片添加到項目中的一組媒體中。

Photo photo = new Photo(); 
photo.setPhotoType("logo"); 
photo.setWidth(100); 
photo.setHeight(100); 
project.getProjectMedias().add(photo); 

關於保存項目對象,我收到以下日誌。見在年底有一個不需要插入到正在創建錯誤不存在的表:

Hibernate: insert into chetak.tbl_project (addressId, availableUnits, basicSellingPrice, bhk, builtUpAreaHigh, builtUpAreaLow, category, contactId, currentProjectStatus, description, developer, endPrice, latitude, listingTitle, listingType, longitude, numberOfBuildings, postedByName, postedByUserId, postedByUserType, projectLaunchDate, projectName, sourceListedDate, startPrice, totalUnits) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) 
Hibernate: insert into chetak.tbl_media (caption, dateCreated, description, isApproved, mime, size, source, title, type, url) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) 
Hibernate: insert into chetak.tbl_photo (height, photoType, width, mediaId) values (?, ?, ?, ?) 

Hibernate: insert into tbl_project_tbl_media (tbl_project_projectId, projectMedias_mediaId) values (?, ?) 
WARN : org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL Error: 1146, SQLState: 42S02 
ERROR: org.hibernate.engine.jdbc.spi.SqlExceptionHelper - Table 'chetak.tbl_project_tbl_media' doesn't exist 

這是由於一些Hibernate映射錯誤?

回答

1

Hibernate爲您的一對多關係創建一個名爲tbl_project_tbl_media的鏈接表。我想你只是想在你的媒體表中引用項目的列,從而避免使用鏈接表。

@JoinColumn註解就是這樣做的。我現在無法自己編譯和運行它,因此不會發布任何代碼,但基本上可以在Media類中創建一個Project字段,然後在@之前或之後使用@JoinColumn(「yourColumnName」)。一對多。

看到這個問題: @OneToMany without inverse relationship and without a join table?

1

不知道你使用的是什麼版本的Hibernate。我的雙向映射@OneToMany關係的標準方法如下。它不爲關係創建一箇中介表:

@Entity 
public class Actor implements Serializable { 
    ... 
    @OneToMany(mappedBy="actor", fetch=FetchType.EAGER) 
    private Set<Account> account; 
    ... 
} 

@Entity 
public class Account implements Serializable 
{ 
    ... 
    @ManyToOne 
    private Actor actor; 
    ... 
} 

我懷疑是照片擴展媒體的事實有什麼與你的問題。