JPA - > Hibernate没有生成自动id

时间:2013-01-02 14:38:16

标签: hibernate jpa

我有一个辅助独立应用程序来加载某些表中实体的值,并且它正在下降,因为Hibernate试图创建记录而不指定键值(即使它被指定为@GeneratedValue(strategy=GenerationType.AUTO))。 / p>

豆子是:

@Entity
public class Location implements Serializable {

  private static final long serialVersionUID = 1L;

  // startRegion attributes
  @Id
  @GeneratedValue(strategy=GenerationType.AUTO)
  private int id = 0;

  @ManyToOne(fetch = FetchType.LAZY)
  private Location parent = null;

  @Column(nullable=false)
  private boolean active = false;

  @OneToMany(mappedBy="parent", cascade=CascadeType.ALL, fetch=FetchType.LAZY)
  private Set<Location> divisions = null;

  @OneToMany(mappedBy="location", fetch=FetchType.EAGER, cascade=CascadeType.ALL)
  @MapKey(name="localeId")
  private Map<String, Location_i18n> descriptions = new HashMap<String, Location_i18n>();

  @Column(nullable=true, length=150)
  private String path = null;

  @Column(nullable=true, length=20)
  private String prismaCode = null;

  @Column(nullable=true, length=5)
  private String shortCode = null;
}

Hibernate日志中显示的SQL缺少id字段:

insert into Location (active, parent_id, path, prismaCode, shortCode) values (?, ?, ?, ?, ?)

显然会导致约束违规异常。

persistence.xml的相关属性:

  <property name="hibernate.dialect" value="org.hibernate.dialect.SQLServer2008Dialect"/>
  <property name="hibernate.show_sql" value="true"/>
  <property name="hibernate.hbm2ddl.auto" value="validate"/>
  <property name="hibernate.connection.driver_class" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>

为了增加我的挫败感,我在之前的流程中做了一个类似的过程,但我找不到导致问题的任何差异。

我已经针对MS SQL 2008 Express尝试了Hibernate 3.6.10和4.1.8。

有什么想法吗?提前谢谢。

3 个答案:

答案 0 :(得分:1)

它不起作用,因为您的数据库的AUTO策略在于依赖数据库来生成ID。表的ID列应该是自动增量列,或者您应该更改ID生成策略。

答案 1 :(得分:0)

您通过输入选择查询手动创建了表 所以冬眠不知道产生的顺序 通过名称var result = "2018-04-23 15:21:15 +0300'".split(" "); var date=result[0].trim().split("-"); var time=result[1].trim().split(":"); var mydate = new Date(parseInt(date [2], 10), parseInt(date [1], 10) - 1, parseInt(date [0], 10), parseInt(time [0], 10), parseInt(time [1], 10), parseInt(time [2], 10));

创建序列
hibernate_sequence

答案 2 :(得分:-1)

如果您使用MsSQL,您应该将所有注释放在getter方法之上......有时候hibernate会忽略上面定义的注释(主要是MsSQL)......