Использование реализации EclipseLink JPA2 (не уверен, что это совпадает с реализацией Hibernate)Почему JPA выбирает String для JoinColumn независимо от типов ключей?
У меня есть простая структура, в которой у организации есть контракты. Вот 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?
Update: Вот соответствующая информация от лица организации
@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 контракт
@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
}
обновлен с соответствующей информацией от двух объектов. – digitaljoel
@digitaljoel: Посмотрите мое обновление. Кстати, вы определили свойство 'eclipselink.target-database' в вашем' persistence.xml'? И какова ценность 'eclipselink.ddl-generation'? –
Спасибо за помощь на этом Паскале. и мой ddl-gneration - это таблицы drop-and-create-tables, когда я возился с этим материалом. Как только я его отработаю, я просто прокомментирую это вообще. Удаление ссылочного имени столбца сейчас ... –
digitaljoel