我有以下实体类(在Groovy中):
import javax.persistence.Entity
import javax.persistence.Id
import javax.persistence.GeneratedValue
import javax.persistence.GenerationType
@Entity
public class ServerNode {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
Long id
String firstName
String lastName
}
和我的persistence.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
<persistence-unit name="NewPersistenceUnit">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/Icarus"/>
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
<property name="hibernate.connection.username" value="root"/>
<property name="hibernate.connection.password" value=""/>
<property name="hibernate.archive.autodetection" value="class"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hbm2ddl.auto" value="create"/>
</properties>
<class>net.interaxia.icarus.data.models.ServerNode</class>
</persistence-unit>
</persistence>
和脚本:
import javax.persistence.EntityManager
import javax.persistence.EntityManagerFactory
import javax.persistence.Persistence
import net.interaxia.icarus.data.models.ServerNode
def factory = Persistence.createEntityManagerFactory("NewPersistenceUnit")
def manager = factory.createEntityManager()
manager.getTransaction().begin()
manager.persist new ServerNode(firstName: "Test", lastName: "Server")
manager.getTransaction().commit()
数据库 Icarus 已经存在,但是目前没有表。2我希望Hibernate能够自动创建和/或更新基于实体类的表。3我该如何完成这个任务?
8条答案
按热度按时间bkhjykvo1#
我不知道是否离开
hibernate
的前面有什么不同。参考文献建议它应为
hibernate.hbm2ddl.auto
值
create
将在创建sessionFactory时创建表,并保持它们不变。值
create-drop
将创建表,然后在关闭sessionFactory时删除它们。也许您应该显式地设置
javax.persistence.Table
注解?wribegjk2#
您可以尝试将persistence.xml中的此行从
致:
这是为了维护模式,以遵循您每次运行应用程序时对模型所做的任何更改。
从JavaRanch得到这个
drnojrws3#
有时,根据配置的设置方式,属性标记的长格式和短格式也会造成差异。
例如,如果您有这样的问题:
尝试将其更改为:
yks3o0rb4#
在我的例子中,表不是第一次创建,没有下面列出的最后一个属性:
使用Wildfly的内存H2数据库
nhjlsmyf5#
有一个非常重要的细节,可能会阻止您的hib生成表(假设您已经设置了
hibernate.hbm2ddl.auto
)。您还需要@Table
注解!它已经帮助在我的情况下至少3次-仍然不记得它;)
PS.阅读休眠文档-在大多数情况下,你可能不想将
hibernate.hbm2ddl.auto
设置为create-drop
,因为它会在停止应用程序后删除你的表。gv8xihay6#
1.自动创建表格,与注解无关
1.为此,我们需要像这样修改“hibernate.cfg.xml”。
jckbn6z77#
在applicationContext.xml文件中:
r6hnlfcb8#
为了支持@thorinkor的答案,我将扩展我的答案,不仅对实体使用@Table(name =“table_name”)注解,而且实体类的每个子变量都应该使用@Column(name =“col_name”)注解,这将导致对表的无缝更新。
对于那些正在寻找基于Java类的Hibernate配置的人来说,这个规则也适用于基于Java的配置(NewHibernateUtil)。希望对其他人有所帮助。