我有一个曾经是not-null ="true"的属性.该字段不再需要值,因此我将其更改为not-null ="false",但该表未在数据库中更新.添加新属性不会产生任何问题.
是否有可能hbm2ddl.auto = update自动更改表以删除not-null ="true"?(我知道我可以写一个sql脚本来改变它但是想让它自动更新)
阅读Hibernate之后:hbm2ddl.auto =在生产中更新?出现了一些问题.首先,我使用Hibernate的原因是独立于数据库供应商(不需要编写10个版本的"相同"sql查询,例如.tsql vs sql).
在创建数据库模式(生产环境)时出现我的问题.据我所知,我有两种选择.
在上面的主题中广泛讨论了第一种替代方案.第二种选择是坏的,因为这意味着我回到了第一个问题:"不想创建依赖于数据库供应商的sql语句".(如果"all"(数据库Hibernate支持)正在实现DDL(用于定义和检查数据库结构的SQL子集),则此语句可能为false .)相等).
我们可以将多个JPA持久性单元指向同一个数据库,在不同的Java项目中同时部署在服务器上吗?同时我的意思是,不是在同一秒部署,而是部署在一起.我正在使用hsqldb数据库.
我正在为我的项目提供客户端 - 服务器模型.我有一个统一的数据库表,其中服务器填充数据,然后客户端访问不同项目中的数据.我可以通过服务器成功填充数据库.但是当我部署客户端项目时,数据库中的所有数据都会被删除.
我<property name="hibernate.hbm2ddl.auto" value="update" />
用于两个持久性单元.
尝试在NHibernate 2.1.2.4000中使用IInterceptor我有以下测试代码:
public class TestingNHibernateInterceptors
{
[Fact]
public void can_intercept_delete_for_audit_log()
{
FullyConfigureDb();
Session(s => s.Linq<Person>().Any().ShouldBe(false));
}
ISessionFactory _sessions;
void Session(Action<ISession> @do)
{
using (var s = _sessions.OpenSession())
{
@do(s);
s.Flush();
}
}
void FullyConfigureDb()
{
var cfg = CreateConfig();
_sessions = cfg.BuildSessionFactory();
BuildSchema(cfg);
}
Configuration CreateConfig()
{
return Fluently.Configure()
.Database(new SQLiteConfiguration().InMemory())
.Mappings(x => x.FluentMappings.Add<PersonMap>())
.BuildConfiguration()
.SetProperty("proxyfactory.factory_class", "NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle")
.SetProperty("show_sql", "true");
}
void BuildSchema(Configuration config)
{
var se = new NHibernate.Tool.hbm2ddl.SchemaExport(config);
se.Execute(false, true, false, _sessions.OpenSession().Connection, null);
}
public class Person
{ …
Run Code Online (Sandbox Code Playgroud) 所有.我有通过hbm2ddl生成DB方案的问题.我想对所有私钥使用共享序列生成器.所以我在某个实体中定义了一次.
@Entity
@SequenceGenerator(name = "MY_SEQUENCE_GENERATOR", sequenceName = "MY_SEQ")
public class MyEntity implements Serializable {
....
}
Run Code Online (Sandbox Code Playgroud)
然后我想对所有id使用这个序列生成器.
public class SomeEntity1 implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MY_SEQUENCE_GENERATOR")
Long id;
....
}
public class SomeEntity2 implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MY_SEQUENCE_GENERATOR")
Long id;
....
}
Run Code Online (Sandbox Code Playgroud)
当我运行hbm2ddl ant任务时,我得到一个异常:
[hibernatetool] javax.persistence.PersistenceException: org.hibernate.AnnotationException: Unknown Id.generator: MY_SEQUENCE_GENERATOR
[hibernatetool] org.hibernate.AnnotationException: Unknown Id.generator: MY_SEQUENCE_GENERATOR
Run Code Online (Sandbox Code Playgroud)
这是一个问题还是我做错了什么?
我让hbm2ddl为我创建表(用于开发目的),列的顺序与类中的字段相反.
如何使它按照与类相同的顺序创建列?
我认为Java类不存储字段的顺序,因此Hibernate根本不知道源中的顺序是什么(如果我考虑更复杂的情况,这似乎是合乎逻辑的).
但是,我能否至少要求Hibernate将PK和FK列作为第一列?
Hibernate 4.0.0(JBoss AS 7.1.2)MySQL 5.1.x.
我正在更新pom.xml依赖项的版本,当我从以下位置更改hibernate3-maven-plugin的版本时,我遇到了模糊的错误
<plugin>
<!-- Run "mvn hibernate3:hbm2ddl" to generate schema -->
<groupId>org.codehaus.mojo</groupId>
<artifactId>hibernate3-maven-plugin</artifactId>
<version>2.2</version>
</plugin>
Run Code Online (Sandbox Code Playgroud)
至
<plugin>
<!-- Run "mvn hibernate3:hbm2ddl" to generate schema -->
<groupId>org.codehaus.mojo</groupId>
<artifactId>hibernate3-maven-plugin</artifactId>
<version>3.0</version>
</plugin>
Run Code Online (Sandbox Code Playgroud)
使用2.2版,一切都可以成功编译,并且
mvn hibernate3:hbm2ddl
Run Code Online (Sandbox Code Playgroud)
从带注释的类创建正确的架构。
当我再次运行hbm2ddl命令时,仅更改版本只会导致以下错误:
[ERROR] Failed to execute goal org.codehaus.mojo:hibernate3-maven-plugin:3.0:hbm2ddl (default-cli) on project myProject: There was an error creating the AntRun task. NullPointerException -> [Help 1]
Run Code Online (Sandbox Code Playgroud)
完整的堆栈跟踪如下:
[ERROR] Failed to execute goal org.codehaus.mojo:hibernate3-maven-plugin:3.0:hbm2ddl (default-cli) on project myProject: There was an error creating the AntRun task. NullPointerException -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed …
Run Code Online (Sandbox Code Playgroud) 在我的hibernate-4实体中,我使用推荐的jadira usertypes映射joda-time DateTime属性:
@Entity
@Table(name="timing")
public class TimingEntity {
...
@Basic(optional=false)
@Column(name="moment")
@Type(type="org.jadira.usertype.dateandtime.joda.PersistentDateTime")
public DateTime getMoment() {
...
Run Code Online (Sandbox Code Playgroud)
我的数据库是MySQL.将hibernate属性hbm2ddl.auto
设置为create
value,我在timing
表中生成了以下列:
CREATE TABLE `timing` (
...
`moment` DATETIME NOT NULL,
...
)
Run Code Online (Sandbox Code Playgroud)
生成的CREATE TABLE
包含DATETIME列.MySQL中的DATETIME只有秒精度,没有小数部分.为了启用小数部分,高达微秒,MySQL 5.6.4及更高版本启用 DATETIME(precision)
列,例如DATETIME(3)
具有毫秒精度.
我的问题是 - 有没有办法为hbm2ddl生成的时间字段指定精度?至少,这是jadira usertypes,或java.sql,或jdbc驱动程序机制的问题?
PS当我手动修改数据库表以获得我想要的精确列精度时DATETIME(3)
,一切正常 - joda DateTimes以毫秒精度从DB写入和读取.
我正在研究我的第一个简单的Hibernate应用程序.问题的症结在于,我已经重命名了持久化类的成员(对所有其他部分进行了适当的更改)并重新运行应用程序.由于'hbm2ddl.auto'属性在配置xml中被赋予'create'值,所以Hibernate应该在每次运行时创建新表,但是,它没有这样做.以下是详细信息:
类:
public class Event {
private Long id;
private String title;
private Date date;
public Event() {
// this form used by Hibernate
}
public Event(String title, Date date) {
// for application use, to create new events
this.title = title;
this.date = date;
}
public Long getId() {
return id;
}
private void setId(Long id) {
this.id = id;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
} …
Run Code Online (Sandbox Code Playgroud) 为什么hbm2ddl会忽略@Column注释?
这是我的班级: -
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "BASETEMPLATE")
public class BaseTemplate implements IBaseTemplate
{
private Integer id;
@Column(name="TEMPLATENAME")
private String templateName;
@Column(name="BASETEMPLATEID")
private Integer baseTemplateId;
@Id
@GeneratedValue
@Column(name = "TEMPLATEID")
@Override
/** {@inheritDoc} */
public Integer getId() { return id; }
...
}
Run Code Online (Sandbox Code Playgroud)
和hbm2dll生成此(sqlserver)表
dbo.BASETEMPLATE
(
TEMPLATEID int
templateName varchar(255)
baseTemplateId int
)
Run Code Online (Sandbox Code Playgroud)
dialect是org.hibernate.dialect.SQLServerDialect奇怪的是,主键始终是正确创建的?