2014-02-11 149 views
0

我有遗留数据库哪些实体使用组合键映射。我使用Eclipse JPA Tools将这些表转换为实体,但接收到的实体不工作。在Tomcat启动我收到异常: referencedColumnNames(PETROL_STATION_ID, PROVIDER_ID) of xxx.FuelCardEntity.petrolStationInfo referencing xxx.PetrolStationInfoEntity not mapped to a single propertyManyToOne与组合键的关系

复合键类:

@Embeddable 
public class PetrolStationInfoEntityPK implements Serializable { 
private static final long serialVersionUID = 1L; 

@Column(name="PETROL_STATION_ID", insertable=false, updatable=false) 
private long petrolStationId; 

@Column(name="PROVIDER_ID", insertable=false, updatable=false) 
private long providerId; 

@Column(name = "\"VERSION\"") 
private long version; 

// hashCode and equals method 
} 

PetrolStationInfoEntity类:

@Entity 
@Table(name="PETROL_STATION_INFO") 
@NamedQuery(name="PetrolStationInfoEntity.findAll", query="SELECT p FROM PetrolStationInfoEntity p") 
public class PetrolStationInfoEntity implements Serializable { 
private static final long serialVersionUID = 1L; 

@EmbeddedId 
private PetrolStationInfoEntityPK id; 
} 

的FuelCardEntity类控股的关系:

public class FuelCardEntity implements Serializable { 
private static final long serialVersionUID = 1L; 

@EmbeddedId 
private FuelCardEntityPK id; 

// bi-directional many-to-one association to PetrolStationInfoEntity 
@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumns({ 
     @JoinColumn(name = "INFO_PETROL_STATION_ID", referencedColumnName = "PETROL_STATION_ID", nullable = false, insertable = false, updatable = false), 
     @JoinColumn(name = "INFO_PROVIDER_ID", referencedColumnName = "PROVIDER_ID", nullable = false, insertable = false, updatable = false) }) 
private PetrolStationInfoEntity petrolStationInfo; 

的只有建议我找到了阿里亚dy是使用@JoinColumns,但正如你所看到的,它已经在那里,它仍然不起作用。任何想法如何解决这个问题而不改变数据库模式? 这个应用程序是用Spring 3 + Hibernate 4编写的。

在此先感谢!

回答

1

你的问题是关键!您在关键对象中有3个属性 - JPA假定您需要全部3列进行唯一标识。因此,当您尝试将@JoinColumns仅用于前2列时会引发错误,因为他期望3.当您将第三列VERSION添加到@JoinColumns时,它应该可以工作!

+0

是的,我发现这个问题缺少专栏刚刚写后,它帮助! :)有趣的部分是,实体是使用JPA工具生成的,所以我不确定为什么第三列丢失。我的瞎猜是它用'@Column(name =“\ VERSION \”“)创建了'PetrolStationInfoEntityPK'。看起来这些第二个双引号是它被省略的问题。 – Nav