Подтвердить что ты не робот

Отображение серийного типа PostgreSQL с аннотациями Hibernate

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

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

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

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

Спасибо

4b9b3361

Ответ 1

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

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

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

EDIT: Обратите внимание, что это сопоставление не влияет на 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;

Ответ 2

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

это произошло, хотя:

@Id
@Column(name = "your_id", columnDefinition = "serial")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer yourId;

Ответ 3

Я использую это с 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;