2013-03-28 98 views
0

希望有人能帮助我解决这个问题。JPA Hibernate父/子映射混淆

我试图创建使用JPA/Hibernate的两个实体之间的双向连接。

我有这个问题,这似乎指出,我的数据库列名称需要匹配我的价值对象属性名称 - 但这似乎很奇怪。希望有人能帮助我,提供一些清晰。

不幸的是,我处于一个明亮的星星命名列名无意义名称的位置。 我不能改变列名 - 相信我 - 如果可以的话 - 我会的!

因此,这里是我的架构是什么样子: -

Customer 
======== 
CS1 -- The ID column 
CS2 -- Customer Description 

ContactDetails 
============== 
CD1 -- The ID column 
CD2 -- The FK to the Customer table 
... 

正如你所期望我有两个价值目标,我的应用程序内 - 这些看起来像这样: -

Customer.java

@Entity 
@Table("Customer") 
public class Customer { 
    @Id 
    @GeneratedValue(strategy = IDENTITY) 
    @Column(name = "CS1", nullable=false, columnDefinition="INTEGER") 
    private int id; 
} 

@OneToMany (cascade = CascadeType.ALL, mappedBy = "customerId", fetch = FetchType.EAGER) 
private Set <ContactDetailsVO> contactDetails = new HashSet <CustomerDetailsVO>(); 
} 

ContactDetails.java

public class ContactDetails { 
    @Id 
    @GeneratedValue(strategy = IDENTITY) 
    @Column(name = "CD1", nullable=false, columnDefinition="INTEGER") 
    private int id; 

@Column(name = "CD2") 
long customerId; 

@ManyToOne(optional = false) 
@JoinColumn(name = "customerId", referencedColumnName = "id") 
private CustomerVO customer; 

public CustomerVO getCustomer() { 
    return customer; 
} 

public void setCustomer(CustomerVO customer) { 
    this.customer = customer; 
} 
} 

不幸的是,引用对象的这种做法属性名称,用于映射关系似乎并没有工作 - 我得到以下,在启动时: -

Caused by: org.hibernate.HibernateException: Missing column: customerId in TestDB.dbo.ContactDetails 
    at org.hibernate.mapping.Table.validateColumns(Table.java:276) 
    at org.hibernate.cfg.Configuration.validateSchema(Configuration.java:131 

所以,如果我再改变映射使实际使用中的表的列名,而不是,我得到如下: -

Customer.java

@Entity 
@Table("Customer") 
public class Customer { 
    @Id 
    @GeneratedValue(strategy = IDENTITY) 
    @Column(name = "CS1", nullable=false, columnDefinition="INTEGER") 
    private int id; 
} 

@OneToMany (cascade = CascadeType.ALL, mappedBy = "CD2", fetch = FetchType.EAGER) 
private Set <ContactDetailsVO> contactDetails = new HashSet <CustomerDetailsVO>(); 
} 

ContactDetails.java

public class ContactDetails { 
    @Id 
    @GeneratedValue(strategy = IDENTITY) 
    @Column(name = "CD1", nullable=false, columnDefinition="INTEGER") 
    private int id; 

@Column(name = "CD2") 
long customerId; 

@ManyToOne(optional = false) 
@JoinColumn(name = "CD2", referencedColumnName = "CS1") 
private CustomerVO customer; 

public CustomerVO getCustomer() { 
    return customer; 
} 

public void setCustomer(CustomerVO customer) { 
    this.customer = customer; 
} 
} 

然后我得到如下: -

Caused by: org.hibernate.MappingException: Could not determine type for: 
com.myCompany.model.vo.CustomerVO, at table: ContactDetails, for columns: 
     [org.hibernate.mapping.Column(customer)] 
    at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:306) 

正如我说,要解决这个明显的方式就是将其命名我的对象的属性,一样的表列名称 - 但考虑到命名表列的愚蠢,我宁愿将它隔离我的应用程序。

有人可以帮助揭开这种奇怪的行为吗?

在此先感谢。

回答

-1

好吧 - 所以这是我认为Hibernate中的一个真正的问题。基本上,如果你混合使用属性和方法注解装饰方法,Hibernate会给你伪造,无意义的错误。希望这可以为我节省6小时的时间。