2014-06-05 21 views
1

我使用生成工具來生成hibernate的實體,我也得到像下面這樣的錯誤:外鍵和引用類如何在hibernate實體中共存?

Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: model.PayLogEntity column: brank_card_id (should be mapped with insert="false" update="false") 
    at org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:676) 
    at org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication(PersistentClass.java:698) 
    at org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:720) 
    at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:474) 
    at org.hibernate.mapping.RootClass.validate(RootClass.java:235) 
    at org.hibernate.cfg.Configuration.validate(Configuration.java:1362) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1865) 
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory(LocalSessionFactoryBean.java:860) 
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:779) 
    at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:188) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1514) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452) 
    ... 67 more 

,並拋出錯誤類是如下:

package model; 

import javax.persistence.*; 
import java.sql.Timestamp; 

/** 
* Created by shenshijun on 14-6-5. 
*/ 
@Entity 
@Table(name = "pay_log", schema = "", catalog = "healthclube") 
public class PayLogEntity { 
    private int id; 
    private Integer userId; 
    private String brankCardId; 
    private String payType; 
    private Timestamp payTime; 
    private Double count; 
    private String message; 
    private BankCardEntity bankCardByBrankCardId; 

    @Id 
    @Column(name = "id") 
    public int getId() { 
     return id; 
    } 

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

    @Basic 
    @Column(name = "user_id") 
    public Integer getUserId() { 
     return userId; 
    } 

    public void setUserId(Integer userId) { 
     this.userId = userId; 
    } 

    @Basic 
    @Column(name = "brank_card_id") 
    public String getBrankCardId() { 
     return brankCardId; 
    } 

    public void setBrankCardId(String brankCardId) { 
     this.brankCardId = brankCardId; 
    } 

    @Basic 
    @Column(name = "pay_type") 
    public String getPayType() { 
     return payType; 
    } 

    public void setPayType(String payType) { 
     this.payType = payType; 
    } 

    @Basic 
    @Column(name = "pay_time") 
    public Timestamp getPayTime() { 
     return payTime; 
    } 

    public void setPayTime(Timestamp payTime) { 
     this.payTime = payTime; 
    } 

    @Basic 
    @Column(name = "count") 
    public Double getCount() { 
     return count; 
    } 

    public void setCount(Double count) { 
     this.count = count; 
    } 

    @Basic 
    @Column(name = "message") 
    public String getMessage() { 
     return message; 
    } 

    public void setMessage(String message) { 
     this.message = message; 
    } 

    @Override 
    public boolean equals(Object o) { 
     if (this == o) return true; 
     if (o == null || getClass() != o.getClass()) return false; 

     PayLogEntity that = (PayLogEntity) o; 

     if (id != that.id) return false; 
     if (brankCardId != null ? !brankCardId.equals(that.brankCardId) : that.brankCardId != null) return false; 
     if (count != null ? !count.equals(that.count) : that.count != null) return false; 
     if (message != null ? !message.equals(that.message) : that.message != null) return false; 
     if (payTime != null ? !payTime.equals(that.payTime) : that.payTime != null) return false; 
     if (payType != null ? !payType.equals(that.payType) : that.payType != null) return false; 
     if (userId != null ? !userId.equals(that.userId) : that.userId != null) return false; 

     return true; 
    } 

    @Override 
    public int hashCode() { 
     int result = id; 
     result = 31 * result + (userId != null ? userId.hashCode() : 0); 
     result = 31 * result + (brankCardId != null ? brankCardId.hashCode() : 0); 
     result = 31 * result + (payType != null ? payType.hashCode() : 0); 
     result = 31 * result + (payTime != null ? payTime.hashCode() : 0); 
     result = 31 * result + (count != null ? count.hashCode() : 0); 
     result = 31 * result + (message != null ? message.hashCode() : 0); 
     return result; 
    } 

    @ManyToOne 
    @JoinColumn(name = "brank_card_id", referencedColumnName = "id") 
    public BankCardEntity getBankCardByBrankCardId() { 
     return bankCardByBrankCardId; 
    } 

    public void setBankCardByBrankCardId(BankCardEntity bankCardByBrankCardId) { 
     this.bankCardByBrankCardId = bankCardByBrankCardId; 
    } 
} 

似乎brank_card_id在實體有兩次映射,一個是getBrankCardId,另一個是getBankCardByBrankCardId。所以我的問題是如何更改代碼來消除衝突?

+0

其實我也找到了類似的問題[鏈接](http://stackoverflow.com/questions/4892925/how-can-i-map- insert-false-update-false-on-a-composite-id-key-property-whi)這將有所幫助。 – ssj

回答

0

Hibernate說什麼是你有2列定義在這個表中名稱brank_card_id。其一是:

@Basic 
@Column(name = "brank_card_id") 
public String getBrankCardId() { 
    return brankCardId; 
} 

,另一個是:

@ManyToOne 
@JoinColumn(name = "brank_card_id", referencedColumnName = "id") 
public BankCardEntity getBankCardByBrankCardId() { 
    return bankCardByBrankCardId; 
} 

@JoinColumn標註的名稱屬性是外鍵列的實際名稱。

你不能有2列叫做brank_card_id。而不是打電話給您的加入列brank_card_id稱之爲其他東西,如bank_card_fk。任何事情都應該有效。只要確保你在關係的另一邊正確引用它。

更改@JoinColumn註釋,以配合以下幾點:

@ManyToOne 
@JoinColumn(name = "bank_card_fk", referencedColumnName = "id") 
public BankCardEntity getBankCardByBrankCardId() { 
    return bankCardByBrankCardId; 
} 
+0

'@JoinColumn(name =「brank_card_id」,referencedColumnName =「id」)'。您不能將名稱更改爲'brank_card_id'到'brank_card_pk',因爲'brank_card_id'映射到表中的列,並且'brank_card_pk'甚至不存在於表中。 – ssj

+0

查看我的更新回答 – JamesENL

+0

我明白了你的想法,但我認爲這不是一個好主意。因爲你提出的改變使得這一方的映射變得沒用,而在另一方面,我有:@OneToMany(mappedBy =「userByUserId」) public Collection getBankCardsById(){ return bankCardsById; }'。所以這些更改會導致映射失敗 – ssj

相關問題