使用 JPA 休眠不会创建表
Posted
技术标签:
【中文标题】使用 JPA 休眠不会创建表【英文标题】:Hibernate with JPA won't create table 【发布时间】:2013-02-10 14:50:49 【问题描述】:我想使用 Hibernate + JPA 创建一个表。问题是,每当我运行我的代码时,它都不会创建任何表。我已经创建了一个空数据库。我使用 Hibernate + JPA + HSQL + Maven。
这是我的 persistence.xml:
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<!-- Provider of Persistence -->
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<!-- Classes, in which JPA-Annotations are read -->
<class>com.mysite.warehousebase.base.ProductData</class>
<properties>
<property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"/>
<property name="hibernate.connection.url" value="jdbc:hsqldb:Warehouse"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
<property name="hibernate.connection.username" value="sa" />
<property name="hibernate.connection.password" value="" />
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
</properties>
</persistence-unit>
</persistence>
这是我的 productData.java 代码:
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import org.hibernate.annotations.ForeignKey;
import org.hibernate.validator.NotNull;
@Entity
@Table(name = "products")
public class ProductData extends Entityclass
private static final long serialVersionUID = 1L;
/*
//Product Addition Time
@NotNull
@Column(name = "added", nullable = false)
private Date productAdded;*/
//Product Name
@NotNull
@Column(name = "productname", nullable = false)
private String productName;
//Product Description
@Column(name = "productdescription", nullable = true)
private String productDescription;
//Product Size
@Column(name = "productsize", nullable = true)
private String productSize;
//Product Amount
@NotNull
@Column(name = "productamount", nullable = false)
private int productAmount;
//Product Left
//Attribute to be calculated in own method
@NotNull
@Column(name = "productleft", nullable = false)
private int productLeft;
//Product buy price
@NotNull
@Column(name = "productprice", nullable = false)
private double productPrice;
//Total cost
//Attribute to be calculated in own method
@NotNull
@Column(name = "totalproductprice", nullable = false)
private double totalProductPrice;
//Product sell price
@NotNull
@Column(name = "productsellprice", nullable = false)
private double productSellPrice;
//Product sale
//Attribute to be calculated in own method
@NotNull
@Column(name = "totalsellprice", nullable = false)
private double totalSellPrice;
//Difference between cost and sale (total)
//Attribute to be calculated in own method
@NotNull
@Column(name = "buyselldifference", nullable = false)
private double buySellDifference;
//Product status; ordered, at warehouse, reserved.
//Attribute to be calculated in own method
@NotNull
@Column(name = "productstatus", nullable = false)
private String productStatus;
@Column(name = "reservedproducts", nullable = true)
private int reservedProducts;
/**
* All Setters and Getters
*
*/
/**
* @return the productName
*/
public String getProductName()
return productName;
/**
* @param productName the productName to set
*/
public void setProductName(String productName)
this.productName = productName;
/**
* @return the productDescription
*/
public String getProductDescription()
return productDescription;
/**
* @param productDescription the productDescription to set
*/
public void setProductDescription(String productDescription)
this.productDescription = productDescription;
/**
* @return the productSize
*/
public String getProductSize()
return productSize;
/**
* @param productSize the productSize to set
*/
public void setProductSize(String productSize)
this.productSize = productSize;
/**
* @return the productAmount
*/
public int getProductAmount()
return productAmount;
/**
* @param productAmount the productAmount to set
*/
public void setProductAmount(int productAmount)
this.productAmount = productAmount;
/**
* @return the productLeft
*/
public int getProductLeft()
return productLeft;
/**
* @param productLeft the productLeft to set
*/
public void setProductLeft(int productLeft)
this.productLeft = productLeft;
/**
* @return the productPrice
*/
public double getProductPrice()
return productPrice;
/**
* @param productPrice the productPrice to set
*/
public void setProductPrice(double productPrice)
this.productPrice = productPrice;
/**
* @return the totalProductPrice
*/
public double getTotalProductPrice()
return totalProductPrice;
/**
* @param totalProductPrice the totalProductPrice to set
*/
public void setTotalProductPrice(double totalProductPrice)
this.totalProductPrice = totalProductPrice;
/**
* @return the productSellPrice
*/
public double getProductSellPrice()
return productSellPrice;
/**
* @param productSellPrice the productSellPrice to set
*/
public void setProductSellPrice(double productSellPrice)
this.productSellPrice = productSellPrice;
/**
* @return the totalSellPrice
*/
public double getTotalSellPrice()
return totalSellPrice;
/**
* @param totalSellPrice the totalSellPrice to set
*/
public void setTotalSellPrice(double totalSellPrice)
this.totalSellPrice = totalSellPrice;
/**
* @return the buySellDifference
*/
public double getBuySellDifference()
return buySellDifference;
/**
* @param buySellDifference the buySellDifference to set
*/
public void setBuySellDifference(double buySellDifference)
this.buySellDifference = buySellDifference;
/**
* @return the productStatus
*/
public String getProductStatus()
return productStatus;
/**
* @param productStatus the productStatus to set
*/
public void setProductStatus(String productStatus)
this.productStatus = productStatus;
/**
* @return the reservedProducts
*/
public int getReservedProducts()
return reservedProducts;
/**
* @param reservedProducts the reservedProducts to set
*/
public void setReservedProducts(int reservedProducts)
this.reservedProducts = reservedProducts;
/**
* @return the productSection
*/
public ProductSection getProductSection()
return productSection;
/**
* @param productSection the productSection to set
*/
public void setProductSection(ProductSection productSection)
this.productSection = productSection;
public ProductData()
public ProductData(String productName)
this.productName = productName;
还有我的 main.java 代码:
public static void main(String[] args)
DataStructureTest testProduct = new DataStructureTest();
testProduct.testProductData();
怎么了?为什么 Hibernate 不会创建需要的表?我尝试使用值为“update”的 hibernate.hbm2ddl.auto。没用。
【问题讨论】:
【参考方案1】:你可以试试
<property name="hibernate.hbm2ddl.auto" value="create"/>
还有 'transaction-type="RESOURCE_LOCAL"
在持久化 xml 中定义
【讨论】:
是的,我已经尝试过您的建议,但仍然无法正常工作。我有jdbc:hsqldb:Warehouse;create=true
【参考方案2】:
我找到了解决方案。出于某种原因的价值
property name="hibernate.connection.url" value="jdbc:hsqldb:Warehouse"
行不通。因此,我没有做的是创建了一个数据库连接,该连接的值如下
jdbc:hsqldb:file:[folder name]
此文件夹名称是用户定义的。因此,该特定行的新代码将是:
property name="hibernate.connection.url" value="jdbc:hsqldb:file:[folder name]"
现在一切运行顺利,表格已创建和更新:)。
【讨论】:
以上是关于使用 JPA 休眠不会创建表的主要内容,如果未能解决你的问题,请参考以下文章
使用 JPA 和 Hibernate 提供程序的多对多关系不会创建主键