Отображение серийного типа 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;
Буду признателен за любую помощь в этом.
Спасибо
Ответы
Ответ 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;