hibernate无法获得下一个序列值

时间:2016-06-13 09:13:28

标签: java hibernate postgresql

我有一个类是postgress数据库中的一个表。然后该类由其他类扩展。主类在顶部有

的注释

@Inheritance(策略= InheritanceType.TABLE_PER_CLASS)

@Entity
@Table(name="policy_action")
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public class PolicyAction {


  @Id
  @GeneratedValue(strategy=GenerationType.TABLE)
  @Column(name="id")
  private int id;
  .....

第二课

public class myspecialPolicy extends policy {
    ....
}

插入数据库时​​会抛出以下错误

org.postgresql.util.PSQLException:ERROR:relation" hibernate_sequence"不存在

我不知道如何解决这个问题,任何帮助都会提前感谢。

3 个答案:

答案 0 :(得分:2)

如果使用序列值,则应使用:

@Entity
@Table(name="policy_action")
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public class PolicyAction {


  @Id
  @GeneratedValue(strategy=GenerationType.Table,generator="genName")
  @TableGenerator(name="genName", table="sequenceTable", pkColumnName="seqName",valueColumnName="value",pkColumnValue="policyAction",initialValue=1,allocationSize=1)
  @Column(name="id")
  private int id;

如果要使用表策略,则必须创建一个包含两列的表(例如,seqName和value,以及表名的sequenceTable),并执行以下操作:

SELECT * FROM(
    SELECT tt.*,
           ROW_NUMBER() OVER(PARTITION BY tt.teamID,tt.position ORDER BY newid()) as rnk
    FROM(
        SELECT DISTINCT p.PlayerID, p.Position, t.TeamID, t.TeamAbbreviation, f.WeekNumber,
        FROM dbo.Fixture f
        INNER JOIN dbo.League l ON f.LeagueID = l.LeagueID
        INNER JOIN dbo.Team t ON l.LeagueID = t.LeagueID
        INNER JOIN dbo.Player p ON t.TeamID = p.TeamID
        WHERE f.WeekNumber = 1 and l.LeagueID = 1) tt) s
WHERE (s.position = 'GK' and s.rnk = 1) OR 
      (s.position = 'DF' and s.rnk <= 4) OR
      (s.position = 'MF' and s.rnk <= 4) OR
      (s.position = 'FW' and s.rnk <= 2) 

答案 1 :(得分:0)

根据您的Hibernate版本,其中一个映射可以帮助您

@Column(name = "id", columnDefinition = "serial")
@Generated(GenerationTime.INSERT)
private int id;

在最近的Hibernate版本(4.3及更高版本)中,您可以使用:

@Id
@Column(name = "id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;

答案 2 :(得分:0)

解决了我的问题是在我的数据库中使用 nxt_val 列创建 hibernate_sequence 表,其中数据类型。

的Sql Create hibernate_sequence(nxt_val long);

然后

Insert into hibernate_sequence (nxt_val) values ('12') NB 12 可以是任意数字。

现在发生的是,hibernate会选择 nxt_val 中的值来确定序列生成并指定任何内容。它适用于 TableGenerator,Sequence,Auto