2015-06-08 47 views
0

嗨,我有點絕望關於我一直在努力的一個問題。作爲一種練習,我正在嘗試構建非常簡單的電子銀行應用程序。因此,一個表稱爲產品(str productName,str descr),另一個表爲savingsAccounts(int accountNo,int clientNo,int balance)。我有兩個類:J2EE JPA和類繼承 - 未知列'字段列表'

savingsAccount.java

@Entity 
@Table(name = "savingsAccounts") 
@NamedQueries({ 
@NamedQuery(name = "savingsAccount.findAll", query = "SELECT s FROM savingsAccount s"), 
@NamedQuery(name = "savingsAccount.findByClientNo", query = "SELECT s FROM savingsAccount s WHERE s.clientNo = :p_clientNo") 
}) 

public class savingsAccount extends product implements Serializable { 
@Id 
@Basic(optional = false) 
@NotNull 
@Column(name = "accountNo") 
private Integer accountNo; 
@Basic(optional = false) 
@NotNull 
@Column(name = "clientNo") 
private Integer clientNo; 
@Basic(optional = false) 
@NotNull 
@Column(name = "balance") 
private double balance; 

//getters and setters nad constructorscode here 

product.java

@Entity 
@Table(name = "products") 
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 
public class product implements Serializable { 
@Id 
@Basic(optional = false) 
@NotNull 
@Size(min = 1, max = 20) 
@Column(name = "productName") 
public String productName; 

@Basic(optional = false) 
@NotNull 
@Size(min = 1, max = 100) 
@Column(name = "descr") 
private String descr; 

// gettes和setter contructors

,但是當我運行namedquery savingsAccount.findByClientNo它給了我這樣的說法:

SELECT accountNo, productName, balance, clientNo, descr FROM savingsAccounts WHERE (clientNo = ?) 

它給了我這個錯誤: 內部異常:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'descr' in 'field list' 

我莫名其妙地「感覺」的問題是,在SavingAccount表中沒有名爲descr的字段,但我真的不知道如何使其工作......感謝所有人的幫助。

+0

感謝人們提供非常有用的提示。也許我會試圖解釋我的動機,以這種方式進行。也許你會告訴我這是完全錯誤的:)。原因是爲了使它更靈活 - 例如當產品說明會發生變化時,那麼數據庫表中的一個簡單更新將完成整個工作,並且就所有儲蓄賬戶具有相同描述而言,我試圖擴展類產品。 –

+0

第二個原因是顯示 - 所有需要顯示的信息都應該包含在同一個類中 - 例如產品概覽將顯示關於餘額,accountNo,clientNo和所需字段descr的一行信息。也許有一些更優雅的方式...... :) –

回答

0

savingsAccount類擴展product,所以它繼承了從類中的字段。因此在相應的表savingsAccounts中也應該有descrproductName的列。

做一個alter table savingsAccounts add column descr varchar(255)或類似,另一種爲productName,它應該工作。

哦,我不能說出來:類名稱應該以一個大寫啓動,像Product

0

關於你的問題:

你爲什麼要延長的 「SavingsAccount」, 「產品」?正如geert3所說,如果您確定需要這些,那麼您在「SavingAccounts」表中缺少相應的列。


不能發表評論,對不相關的部分遺憾,但還是有些反饋:

你爲什麼要使用@Basic註解?這裏似乎沒有用。

我沒有看到你的繼承策略的優勢,但甲骨文教程JEE6說TABLE_PER_CLASS的不少東西。 http://docs.oracle.com/javaee/6/tutorial/doc/bnbqn.html

根據你的需要,你也可以考慮從namedqueries註釋切換到庫接口,其提供了JPA自動解決基本的查詢,並從查詢分開你的域模型。

http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#_declaring_interfaces

而且隨着你似乎配置實體的方式,你可以不採取它的充分利用。例如,如果你的clientNo是指客戶表/實體,然後你可以有類似

@OneToOne(fetch = FetchType.LAZY) //To adapt with the right relationship between savingsAccount/client 
@JoinColumn(name="clientNo") 
private Client client; 
0

所以,如果你正在使用TABLE_PER_CLASS,那麼你應該有以下的列2個數據庫表:

產品

  • PRODUCTNAME(主鍵)
  • DESCR

savingsAccounts

  • 產品名稱(從產品繼承)
  • DESCR(從產品繼承)
  • accountNo
  • clientNo
  • 平衡

不過,我不沒想到這就是你想要的,是嗎?我認爲你通過使儲蓄賬戶繼承產品而困惑。如果你在這種情況下並不特別需要繼承,那麼我就不會使用它。

順便說一下,您正在使用實體中列的非常詳細的定義。

相反的:

@Basic(optional = false) 
@NotNull 
@Size(min = 1, max = 100) 
@Column(name = "descr") 
private String descr; 

你可以寫:

@Column(name = "descr", length = 100, nullable = false) 
private String descr; 

事實上,如果數據庫列名的實體字段的名稱完全匹配,你甚至都不需要name = ... ,因此:

@Column(length = 100, nullable = false) 
private String descr; 

@Basic假定爲基本數據類型( String,Integer,Character等)