J2EE JPA和类继承 - 未知列'字段列表'

时间:2015-06-08 21:58:01

标签: java java-ee jpa inheritance

嗨,我对我一直在努力解决的一个问题感到有点绝望。作为一种做法,我正在尝试构建非常简单的电子银行应用程序。所以一个表叫做products(str productName,str descr),另一个是savingsAccounts(int accountNo,int clientNo,int balance)。我有两个班:

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 and setters and 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'

我以某种方式“感觉”问题是在savingsAccount表中没有名为descr的字段,但我真的不知道如何让它工作......感谢大家的帮助。

3 个答案:

答案 0 :(得分:0)

您的班级savingsAccount扩展了product,因此它会继承该班级的字段。因此,在相应的表savingsAccounts中,还应该有descrproductName的列。

alter table savingsAccounts add column descr varchar(255)执行productName或类似操作,并执行另一项操作。

哦,我不能不说:类名应该以资本开头,如Product

答案 1 :(得分:0)

关于您的问题:

为什么要在“SavingsAccount”上扩展“产品”?如果您确定需要这些,那么您在“SavingAccounts”表中缺少相应的列,如geert3所说。

无法发表评论,对不相关的部分感到抱歉,但仍有一些反馈意见:

为什么使用@Basic注释?这里似乎没用。

我没有看到你的继承策略的优势,但是JEE6的Oracle教程说了很多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引用Client表/实体,那么您可以使用类似

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

答案 2 :(得分:0)

因此,如果您使用TABLE_PER_CLASS,那么您应该有2个数据库表,其中包含以下列:

<强>产品

  • productName(主键)
  • DESCR

<强> savingsAccounts

  • productName(继承自产品)
  • 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用于基本数据类型(StringIntegerCharacter等。)