【问题标题】:Error while saving Hibernate Inheritance保存休眠继承时出错
【发布时间】:2014-12-31 12:55:29
【问题描述】:

我的应用程序正在尝试保存Project 对象和Photo 对象,即MediaPhoto 表中有 media_id 作为外键。

我的课是

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 jpa jpa-2.0 hibernate-mapping


    【解决方案1】:

    Hibernate 为您的一对多关系创建一个名为 tbl_project_tbl_media 的链接表。我认为您只需要 Media 表中的一列引用该项目,从而避免使用链接表。

    @JoinColumn 注释就是这样做的。我现在不能自己编译和运行它来测试,所以不会发布任何代码,但基本上你可以在你的 Media 类中创建一个 Project 字段,然后在 @ 之前或之后使用 @JoinColumn("yourColumnName")一对多。

    看到这个问题: @OneToMany without inverse relationship and without a join table?

    【讨论】:

      【解决方案2】:

      不确定您使用的是哪个版本的 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;
         ...
      }
      

      我怀疑照片扩展媒体的事实与您的问题有关。

      【讨论】:

        猜你喜欢
        • 2013-09-15
        • 1970-01-01
        • 1970-01-01
        • 2011-08-24
        • 1970-01-01
        • 2011-04-03
        • 2011-03-30
        • 1970-01-01
        相关资源
        最近更新 更多