如何让hibernate自动生成表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何让hibernate自动生成表相关的知识,希望对你有一定的参考价值。

参考技术A 通过hibernate.cfg.xml配置数据源、还有就是表的映射路劲什么~然后再在model里建 类.hbm.xml~hbm.xml是有多少个实体类就建多少个hbm.xml~而且前面的名和类名一样~在hbm.xml里面填写建立的字段什么的~然后在写一个测试类~运行测试类的时候就会自动帮你在数据库建立表了~不过数据库是要自己创建的~

如何使用 Hibernate 和 postgresql 为一对多关系实现每个表的自动递增 id 字段

【中文标题】如何使用 Hibernate 和 postgresql 为一对多关系实现每个表的自动递增 id 字段【英文标题】:how to implement auto increment id field per table with Hibernate and postgresql for one to many relationships 【发布时间】:2013-06-05 21:53:02 【问题描述】:

我有 4 个实体一对多消息实体:

@Entity
@Table(name = "Messages")
public class Message 
...
    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "messagesounds_id")
    private Sound sound;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "messagevibrations_id")
    private Vibration vibration;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "messagecolors_id")
    private Color color;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "messageplatforms_id")
    private Platform platform;
...

而其他 4 个实体如下所示:

@Entity
@Table( name = "MessageSounds"  , uniqueConstraints=@UniqueConstraint(columnNames = "name"))
public class Sound 
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;

    @OneToMany(cascade=CascadeType.ALL)
    @JoinColumn(name="messagesounds_id")
    private Set<Message> message;
...

我可以成功创建引用了 4 个引用表的第一条记录的第一条消息记录。但是 postgresql db 中的消息表是这样的:

 id |...| messagesounds_id | messagevibrations_id | messagecolors_id | messageplatforms_id |
 1  |...| 2 | 3 | 4 | 5 |

我想让4个引用表的每个主键都自动递增,这样消息表的第一条记录应该是这样的:

 id |...| messagesounds_id | messagevibrations_id | messagecolors_id | messageplatforms_id |
 1  |...| 1 | 1 | 1 | 1 |

如何使用注解来实现这一点?

【问题讨论】:

这里是答案***.com/questions/2011528/hibernate-auto-increment-id。 我已经在所有 4 个引用实体的主键中尝试过,但它保持不变。我在想是否与休眠序列或postgresql的限制有关 这个问题怎么样:***.com/q/3433724/330315 或者这个:***.com/q/684836/330315 或者这个:***.com/a/4502062/330315 【参考方案1】:

好的,来自Hibernate use of PostgreSQL sequence does not affect sequence table a_horse_with_no_nameless 引用,

我设法为每个引用的表设置了自动递增的主键,如下所示:

@Id
@SequenceGenerator(name="pk_sequence",sequenceName="messagesounds_id_seq", allocationSize=1)
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="pk_sequence")
private int id;

非常感谢所有的研究。

【讨论】:

【参考方案2】:

@Id @GeneratedValue(策略=GenerationType.AUTO) 私人 int id; 并且在坚持时将其保留为空(0)。 (如果您使用 Integer / Long 包装器,则为 null)

在某些情况下,AUTO 策略被重新设置为 SEQUENCE 而不是 IDENTITY 或 TABLE,因此您可能需要手动将其设置为 IDENTITY 或 TABLE(取决于底层数据库)。

似乎 SEQUENCE + 指定序列名称对你有用。

【讨论】:

我已经尝试过了,我正在使用 postgresql。请不要在没有引用来源的情况下复制其他答案。

以上是关于如何让hibernate自动生成表的主要内容,如果未能解决你的问题,请参考以下文章

在hibernate5中,关于让hibernate自动创建表报错的问题。

Hibernate根据实体类自动创建表

如何使用 Hibernate 和 postgresql 为一对多关系实现每个表的自动递增 id 字段

配置hibernate根据实体类自动建表功能

配置hibernate根据实体类自动建表功能

如何让hibernate hbm2ddl生成带分号的SQL?