我希望传递给Hibernate的SessionFactory
hibernate.hbm2ddl.auto=update
Run Code Online (Sandbox Code Playgroud)
并在日志文件中看到生成的sql语句.是不是没有java编码(知道如何用SchemaExport实现结果,但希望hibernate有"in box"解决方案)
我试图在我继承的项目上启用hbm2ddl.auto = validate.我现在为String属性获得了许多错误的列类型异常,这些异常使用text或mediumtext(MySQL数据库)进行映射.
映射是:
@Column(name = "DESCRIPTION", nullable = false, length = 65535)
@Length(max = 65535)
@NotNull
public String getDescription() {
return this.description;
}
Run Code Online (Sandbox Code Playgroud)
db中的数据类型是'text'(utf8_general_ci).
我认为这应该是正确的映射,但Hibernate抱怨它发现了文本,但期待长篇大论.
我检查了hibernate配置,但没有指定对话框.我已经添加
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect"/>
Run Code Online (Sandbox Code Playgroud)
但这似乎没有什么区别.
我知道我可以将columnDefinition ="text"添加到映射中,但我必须在很多地方这样做,恕我直言,映射应该是正确的.出了什么问题?有任何想法吗?
谢谢
在Tomcat Web应用程序上运行的Maven-Spring-Hibernate-MySql中,我正在使用hibernate ddl来生成MySQL5InnoDBDialect的数据库模式.
除了外键的级联选项之外,生成的模式很好.例如,我有这样的结构:
保存用户详细信息对象的用户对象,两者共享相同的密钥:
@Entity
@Table(name = "Users")
public class User implements Serializable {
private static final long serialVersionUID = -359364426541408141L;
/*--- Members ---*/
/**
* The unique generated ID of the entity.
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "User_Id")
protected long id;
@Getter
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "user", optional = true)
protected UserDetails userDetails;
...
}
Run Code Online (Sandbox Code Playgroud)
而用户详细信息:
@Entity
@Table(name = "UserDetails")
public class UserDetails implements Serializable {
private static final long serialVersionUID = …
Run Code Online (Sandbox Code Playgroud) 这里有一个相当具体的问题,但它现在
让我烦恼了一天:我在PostgreSQL 8.3上使用Hibernate Core,Annotations&Validator.
我有以下类设置:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Entry {
@EmbeddedId
protected EntryPK entryPK;
@ManyToMany
private Set<Comment> comments = new HashSet<Comment>();
...
@Embeddable
public class EntryPK implements Serializable {
@ManyToOne(cascade = CascadeType.ALL)
private Database database;
@Length(max = 50)
@NotEmpty
private String pdbid;
...
Run Code Online (Sandbox Code Playgroud)
我想看看长度约束在我的PostgreSQL数据库中转换为长度约束(它适用于@ Entity中的其他字段,而不是@ Embeddable's),但它似乎并不想工作..
甚至使用@IdClass代替@EmbeddedId并在@Entity中的匹配字段上应用Length约束并没有解决这个问题:数据库字段仍然是varchar 255(大约250太大了,不能满足我的需要).
有些人可能会说我不应该关心这个详细程度,但我的OCD方面拒绝放手......;)是不是可以在EmbeddedId中使用Hibernate Validator Annotations并让hbm2ddl将约束应用于数据库字段?
我想用Hibernate和Postgresql自动创建我的数据库表,但是我得到了关于序列的错误.是否可以使用Hibernate自动创建序列,还是手动生成序列?
我的实体示例:
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
@Entity
@Table(uniqueConstraints = { @UniqueConstraint( columnNames = { "id" }) })
@SequenceGenerator(name="SEQ_EXAMPLE_ID", sequenceName="example_id_seq", allocationSize=1)
public class Example {
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_EXAMPLE_ID")
private Long id;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String g
}
Run Code Online (Sandbox Code Playgroud)
Hibernate配置:
hbm2ddl.auto=create-drop
hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
hibernate.show_sql=true
Run Code Online (Sandbox Code Playgroud)
例外:
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.hibernate.exception.SQLGrammarException: could not get next sequence value
org.postgresql.util.PSQLException: …
Run Code Online (Sandbox Code Playgroud) 我正在使用 hbm2ddl 和类似于以下的 Java 代码创建数据库表:
@Entity
public class Filter {
public enum Type {
TypeA, TypeB;
}
@Enumerated(EnumType.STRING)
private Type type;
}
Run Code Online (Sandbox Code Playgroud)
它工作正常,但对于“type”,会创建一个 VARCHAR 列,即 DDL 代码如下所示:
CREATE TABLE IF NOT EXISTS `filter` (`type` varchar(255) DEFAULT NULL)
Run Code Online (Sandbox Code Playgroud)
但我想要的是这样的:
CREATE TABLE IF NOT EXISTS `filter` (`type` enum('TypeA','TypeB') NOT NULL)
Run Code Online (Sandbox Code Playgroud)
这是否可以在 Hibernate 中声明,最好使用注释?
或者有没有办法扩展 SchemaUpdate 并覆盖以我喜欢的方式呈现枚举字段的更改脚本部分的方法?
背景:项目的 PHP 部分使用相同的数据库,我想防止插入无效值。
我使用hibernate hbm2ddl从实体类生成db模式脚本.它运行良好,但每行结束时没有分号,这使我不得不手动添加它们.有没有办法让我免于这个愚蠢的工作?
我是否需要为hibernate表的主键添加索引anoatation以获得不错的性能,我假设用@id标记一个字段意味着创建了一个索引
@Id
private String guid;
Run Code Online (Sandbox Code Playgroud)
但我没有注意到在生成的ddl中创建的任何内容
但是如果我添加了一个@index注释
@Id
@org.hibernate.annotations.Index(name = "IDX_GUID")
private String guid;
Run Code Online (Sandbox Code Playgroud)
然后我注意到在DDL中创建了一个索引.
所以我认为我需要为每个表执行此操作,但我的一部分认为这是非常必要的,因为hibernate肯定希望为主键创建索引作为起点?
数据库表不是由<property name="hbm2ddl.auto">update</property>
设置自动创建的hibernate-cfg.xml
,具有以下组合:
Java 8 + Tomcat 8 + MySQL + Hibernate 5
Java版本:
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)
Run Code Online (Sandbox Code Playgroud)MySQL版本:
mysql Ver 14.14 Distrib 5.6.16, for osx10.7 (x86_64) using EditLine wrapper
Run Code Online (Sandbox Code Playgroud)Tomcat版本:
apache-tomcat-8.0.22
Run Code Online (Sandbox Code Playgroud)pom.xml片段:
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>javax.persistence</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>javax.transaction</groupId>
<artifactId>jta</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.1-api</artifactId>
<version>1.0.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.0.3.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.0.3.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-c3p0</artifactId> …
Run Code Online (Sandbox Code Playgroud)我正在尝试使用 hibernate 5 动态生成一些数据库/表模式,如下所示:
StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder().applySetting("hibernate.hbm2ddl.auto", "create")
.applySetting("hibernate.dialect", "org.hibernate.dialect.MySQLDialect").applySetting("hibernate.id.new_generator_mappings", "true").build();
MetadataSources sources = new MetadataSources(standardRegistry);
for (Class clazz : classes) {
sources.addAnnotatedClass(clazz);
}
MetadataImplementor metadata = (MetadataImplementor)sources.getMetadataBuilder().build();
SchemaExport export = new SchemaExport();
export.create(EnumSet.of(TargetType.SCRIPT), sources.buildMetadata());
Run Code Online (Sandbox Code Playgroud)
我感兴趣的是将结果输出到字符串中,而不是将其写入输出文件。