Почему JPA выбирает строку для Joincolumn независимо от видов ключей?

StackOverflow https://stackoverflow.com/questions/4005984

Вопрос

Использование реализации ECLIPSELINK JPA2 (не уверена, если это то же самое с реализацией Hibernate)

У меня есть простая структура, где организация организация имеет контракты. Вот SQL I экспортировал из 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) поле для ссылки на ключей организации. Я знаю, что я могу использовать колонну следующим образом:

@ManyToOne( optional=false )
@JoinColumn( name="organization_key", referencedColumnName="key", columnDefinition="bigint NOT NULL" )
private Organization organization;

Чтобы получить тип Bigint вместо типа символа.

Для меня нереально ли ожидать, что он получил правильный тип столбца? Я использую это неправильно, или у меня неправильные ожидания? Ожидается ли у меня придется использовать колонну каждый раз?

Обновлять:Вот соответствующая информация от организации организации

@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
}
Это было полезно?

Решение

Для меня нереально ли ожидать, что он получил правильный тип столбца?

Нет, это не нереально, и текущий результат явно неожиданна.

Я использую это неправильно, или у меня неправильные ожидания?

Ваши сопоставления не выглядят не так. Не могли бы вы просто попробовать следующее и подтвердить, что вы получаете тот же результат (я просто пропускаю referencedColumnName Что вам не должно быть, в любом случае определить)?

@Entity
@Table( name = "contract" )
@SequenceGenerator( name = "CONTRACT_SEQ_GEN", sequenceName = "CONTRACT_SEQUENCE" )
public class Contract implements DataObject<Long> {
    @Id
    @GeneratedValue( strategy = GenerationType.SEQUENCE, generator = "CONTRACT_SEQ_GEN" )
    private Long key;
    ...
    @ManyToOne( optional=false )
    @JoinColumn( name="organization_key" )
    private Organization organization;
    ...
}

У меня не установлено PostgreSQL, не могу попробовать себя.

Ожидается ли у меня придется использовать колонну каждый раз?

Нет.

Другие советы

Я считаю, что вопрос является одним из дел чувствительности.

Вы не установили @Column на атрибут идентификатора ключа, поэтому именем столбца по умолчанию - «ключ». В вашем @manytoone вы ссылаетесь на «ключ», который не тот же столбец, поэтому EclipseLink (который чувствителен к регистру и поддерживает неидейственные ссылки на иностранные ключи), предполагал, что это был другой столбец, и тот, о котором он не знал, так дал Это тип по умолчанию varchar.

Либо измените ссылку «Клавиша», либо удалите его, так как он не требуется при ссылке на идентификатор Singleton.

Было бы стоить регистрировать ошибку на EclipseLink, что предупреждение должно быть зарегистрировано, когда ссылка столбца не найден, или имеет неправильный случай (возможно, даже переключать корпус автоматически). На самом деле мы можем уже регистрировать предупреждение уже, вы можете проверить свой журнал.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top