如何让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自动创建表报错的问题。