Использование реализации EclipseLink JPA2 (не уверен, что то же самое с реализацией Hibernate)
У меня есть простая структура, в которой у организации есть контракты. Вот SQL, который я экспортировал из postgres для создания Организации
CREATE TABLE organization (
key bigint NOT NULL,
version integer
);
Если я укажу Договорную сторону Организации следующим образом:
@ManyToOne( optional=false )
@JoinColumn( name="organization_key", referencedColumnName="key" )
private Organization organization;
и затем сбросьте схему, я получаю это.
CREATE TABLE contract (
key bigint NOT NULL,
version integer,
organization_key character varying(255),
);
Мне не имеет смысла, что для ссылки на ключ организации будет использоваться поле (255), изменяющее символ. Я знаю, что могу использовать columnDefinition следующим образом:
@ManyToOne( optional=false )
@JoinColumn( name="organization_key", referencedColumnName="key", columnDefinition="bigint NOT NULL" )
private Organization organization;
чтобы получить тип bigint вместо типа символа.
Нереально ли ожидать, что он получит правильный тип столбца? Я использую это неправильно, или у меня неправильные ожидания? Ожидается ли, что мне придется каждый раз использовать columnDefinition?
Обновление:
Вот соответствующая информация от организации
@Entity
@Table( name = "organization" )
@SequenceGenerator( name = "ORGANIZATION_SEQ_GEN", sequenceName = "ORGANIZATION_SEQUENCE" )
public class Organization
implements DataObject<Long>
{
/**
* key for this instance. Should be managed by JPA provider.
*/
@Id
@GeneratedValue( strategy = GenerationType.SEQUENCE, generator = "ORGANIZATION_SEQ_GEN" )
private Long key;
/**
* JPA version column
*/
@Version
protected int version;
/**
* All contracts for this organization
*/
@OneToMany(mappedBy="organization" )
@OrderBy( "endDate DESC" )
private List<Contract> contracts;
... getters and setters
}
А вот и Контрактный субъект
@Entity
@Table( name = "contract" )
@SequenceGenerator( name = "CONTRACT_SEQ_GEN", sequenceName = "CONTRACT_SEQUENCE" )
public class Contract
implements DataObject<Long>
{
/**
* key for this instance. Should be managed by JPA provider.
*/
@Id
@GeneratedValue( strategy = GenerationType.SEQUENCE, generator = "CONTRACT_SEQ_GEN" )
private Long key;
/**
* Organization that owns this contract, required.
*/
@ManyToOne( optional=false )
@JoinColumn( name="organization_key", referencedColumnName="key" )
private Organization organization;
/**
* JPA version column
*/
@Version
protected int version;
... getters and setters
}