2015-11-19 100 views
3

我試圖將我的@Entity對象映射到其各自的類,其中一個是另一個的參數。休眠實體類映射到兩個不同的表

簡單地說我有這樣的事情:

@Entity 
@Table(name="TableA") 
public class ClassA { 
    @Id 
    private long id; 

    private String paramA; 

    private ClassB classB; 

    // getters and setters here 
} 

ClassB的樣子:

@Entity 
@Table(name="TableB") 
public class ClassB { 
    @Id 
    private long classAId; 

    private String paramB; 

    // getters and setters here 
} 

要保存我使用的接口 - (我懷疑這還是這樣,我使用這是我的問題?)

@Transactional 
public interface ClassADao extends JpaRepository<ClassA, Integer> { 

} 

在我的數據庫中,ClassA中的所有參數映射到除ClassB外的對應表其中的參數都與ClassB的不同表格匹配。我是Hibernate的新手,希望能將ClassB的參數映射到正確的表中。然而這似乎是試圖ClassB的映射到表ClassA的一列,從而給我這個錯誤:

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'classB' in 'field list' 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:404) 
    at com.mysql.jdbc.Util.getInstance(Util.java:387) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:941) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3870) 

我的問題是,是否有辦法(最好是通過註釋)告訴Hibernate使ClassB中的參數映射到它自己的表中?我曾嘗試使用@SecondaryTable,但沒有奏效。

在此先感謝!

+1

我想知道如果我需要爲ClassB創建一個不同的JpaRepository接口並分別保存它們嗎?我希望有一個級聯效應,但也許這是不可能的? – DavidR

+1

你是否也可以給表結構,或者讓休眠生成它?從第一次看它接縫你缺少@OneToOne註釋,它告訴冬眠,你有關係。您可以查看http://www.mkyong.com/hibernate/hibernate-one-to-one-relationship-example-annotation/其中庫存有庫存詳細信息。 –

+0

+1提供表格結構。您還沒有在代碼中定義實體A和B之間的任何關係,所以Hibernate/JPA無法知道它們是否正確映射它們。您必須通過JPA批註('@ OneToOne','@ OneToMany'等)來完成此操作。你可以谷歌JPA教程。關於你的dao ...沒有必要使它成爲'@ Transactional'(Spring數據會處理這個問題),並且由於你的id很長,所以你應該擴展'JpaRepository '。 –

回答

2

與誰對這個評論的人的幫助,我能想出以下解決方案:

@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
private long id; 

@OneToOne(cascade = {CascadeType.ALL}) 
@PrimaryKeyJoinColumn 
private ClassB classB; 

public setClassB(ClassB classB) { 
    this.classB = classB; 
    this.classB.setClassA(this); 
} 

和編輯ClassB的,像這樣:

@Entity 
@Table(name="TableB") 
public class ClassB { 
    @MapsId 
    @OneToOne 
    @JoinColumn 
    private ClassA classA 

    private String paramB; 

    // getters and setters here - including for ClassA 

}

現在當我打電話給彈簧注入ClassADao.save(classA)時,ClassB也可以免費正確保存在數據庫中。

+0

很高興知道是否有更好的解決方案。這是我想出的。 – DavidR

+1

現在,還沒有,儘管我正在開發一個工具包,如果使用Groovy是一個選項,它可以實現大部分自動化。 https://blog.chrylis.com – chrylis