Отображение последовательного типа PostgreSQL с аннотациями Hibernate - PullRequest
23 голосов
/ 12 февраля 2011

Я использую Hibernate 3.3 и PostgreSQL 8.x и хотел бы использовать аннотации Hibernate для сопоставления автоматически увеличиваемого столбца, который НЕ является первичным ключом.

Не имеет значения, отображается ли столбец с использованием типа SERIAL или последовательностей в Postgres, если он автоматически увеличивается базой данных, а не Hibernate.Я пробовал следующие сопоставления, но они всегда генерировали нулевой orderId.

@Column(name = "orderId", insertable = false)
@Generated(GenerationTime.INSERT)
//@GeneratedValue(strategy = javax.persistence.GenerationType.AUTO)
private Integer orderId;

Буду признателен за любую помощь в этом.

Ответы [ 3 ]

29 голосов
/ 12 февраля 2011

Следующее отображение должно работать нормально:

@Column(name = "orderId")
@Generated(GenerationTime.INSERT)
private Integer orderId;

Обратите внимание, однако, что сгенерированное значение для недавно сохраненных объектов недоступно до сброса сеанса.

РЕДАКТИРОВАТЬ: Обратите внимание, что это отображение не влияет, не заставляет Hibernate создавать столбец типа serial во время генерации схемы, поскольку Hibernate ничего не знает о природегенерации значений на стороне базы данных.Поэтому, если вы хотите, чтобы Hibernate создавал столбец с правильным типом, вам нужно указать его явно:

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

А в последней версии Hibernate (4.3) вы можете использовать это:

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long orderId;
22 голосов
/ 16 января 2013

принятый ответ не работает для меня.

это сделал, хотя:

@Id
@Column(name = "your_id", columnDefinition = "serial")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer yourId;
4 голосов
/ 10 августа 2012

Я использую это с postgresql9.1, должно работать и с 8:

@SequenceGenerator(allocationSize=1, initialValue=1, sequenceName="account_id_seq", name="account_id_seq")
@GeneratedValue(generator="account_id_seq", strategy=GenerationType.SEQUENCE)
@Id
@Column(name="id")
private Integer id;
...