0

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

豆是:

@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。

有任何想法吗?预先感谢。

4

3 回答 3

2

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

于 2013-01-02T14:46:15.963 回答
0

您已经通过输入选择查询手动创建了表,因此休眠不知道生成的顺序按名称创建序列hibernate_sequence

CREATE SEQUENCE hibernate_sequence
start with 1
increment by 1
minvalue your_min_value
maxvalue your_max_value
cycle; 
于 2018-06-26T09:12:42.867 回答
-1

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

于 2013-01-02T15:18:36.330 回答