嗨,我对我一直在努力解决的一个问题感到有点绝望。作为一种做法,我正在尝试构建非常简单的电子银行应用程序。所以一个表叫做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的字段,但我真的不知道如何让它工作......感谢大家的帮助。
答案 0 :(得分:0)
您的班级savingsAccount
扩展了product
,因此它会继承该班级的字段。因此,在相应的表savingsAccounts
中,还应该有descr
和productName
的列。
为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个数据库表,其中包含以下列:
<强>产品强>
<强> savingsAccounts 强>
然而,我不认为这是你想要的,是吗?我认为你通过使存储会从产品中继承来解决问题。如果你在这种情况下没有特别需要继承,那么我就不会使用它。
顺便说一下,您正在使用实体中列的非常详细的定义。
而不是:
@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
等。)