2015-03-13 71 views
0

我也遇到了这个例外休眠无法找到逻辑名称

Caused by: 
org.hibernate.MappingException: Unable to find column with logical name: picture_id in org.hibernate.mapping.Table(TXN_INVENTORY_PICTURE) and its related supertables and secondary tables 
     at org.hibernate.cfg.Ejb3JoinColumn.checkReferencedColumnsType(Ejb3JoinColumn.java:564) 
     at org.hibernate.cfg.BinderHelper.createSyntheticPropertyReference(BinderHelper.java:258) 
     at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:116) 
     at org.hibernate.cfg.Configuration.processEndOfQueue(Configuration.java:1596) 
     at org.hibernate.cfg.Configuration.processFkSecondPassInOrder(Configuration.java:1519) 
     at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1420) 
     at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1844) 
     at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:850) 

下面是这些类的要点涉及

@Entity 
@Table(name = "REF_PRODUCT") 
public class Product extends JpaModel{ 

    @Column(name= "NAME") 
    private String name; 

    @Column(name = "MANUFACTURER") 
    private String manufacturer; 

    /** 
    * Work around for missing 
    */ 
    @OneToOne(optional = true) 
    @JoinColumn(name="picture",referencedColumnName = "picture_id") 
    private InventoryItemPicture picture; 
} 

而这里的inventoryItemPicutre

@Entity 
@Table(name = "TXN_INVENTORY_PICTURE") 
public class InventoryItemPicture extends JpaModel{ 

    @Column 
    private byte[] image; 

    @Column 
    private String fileName; 

    public InventoryItemPicture(){ 

    } 
.... 
} 

而这里的JPAModel

@MappedSuperclass 
public abstract class JpaModel { 

    @Id 
    @Column(name ="ID", columnDefinition = "serial") 
    @GeneratedValue(strategy = GenerationType.SEQUENCE) 
    private Long id; 

    @Type(type="org.jadira.usertype.dateandtime.joda.PersistentLocalDateTime") 
    @Column(name = "created_date") 
    private DateTime createdDate; 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public DateTime getCreatedDate() { 
     return createdDate; 
    } 

    public void setCreatedDate(DateTime createdDate) { 
     this.createdDate = createdDate; 
    } 
} 

注:省略了getter和setter方法,而我想在这里实现的是该图片可以在产品类为空

+0

有一列'picture_id'表'TXN_INVENTORY_PICTURE'? – 2015-03-13 15:42:33

+0

@PredragMaric没有,但它有一个id字段。 – user962206 2015-03-13 15:48:04

回答

-1

您的映射错误,referencedColumnName目标列picture_idTXN_INVENTORY_PICTURE表,这是不存在的。

如果picture_idREF_PRODUCT表中的列是一个外键TXN_INVENTORY_PICTURE表的名称,然后更改映射到这个

@OneToOne(optional = true) 
@JoinColumn(name="picture_id") 
private InventoryItemPicture picture; 
+0

已经尝试过,但它显示了一个非null约束的错误。我想要的是图片对象也可以设置为null – user962206 2015-03-13 15:58:14

+0

我已经编辑了我的答案,但不能确定没有数据库结构的确切名称,但您会明白。如果数据库是使用这些注释从实体模型创建的,那么'picture_id'将被创建为空。如果数据库已经创建,并且'picture_id'不能为空,则直接在数据库中将其更改为可空。 JPA仅使用这些注释来从实体模型生成数据库模式。 – 2015-03-13 16:02:21

+0

已经尝试过。我使用实体模型为我生成表,但外键picture_id始终设置为非null。我必须在数据库中进行特别更改,是否有解决此问题的方法 – user962206 2015-03-13 16:16:06