Может ли EclipseLink вызывать ошибку ORA-00957: дублирование имени столбца из-за @DiscriminatorColumn в полиморфном объекте? - PullRequest
0 голосов
/ 20 марта 2011

Я получаю это исключение при попытке сохранить объект entity в базе данных Oracle, и я начал получать эту ошибку только после переключения моего проекта JPA на EclipseLink 2.0 с Hibernate , и я использую «сущность наследование », если это может иметь какое-либо отношение к этому (что я очень подозреваю).

*

Caused by: javax.persistence.PersistenceException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: ORA-00957: duplicate column name
Error Code: 957
Call: INSERT INTO SUREC (ID, PERSON_ID, SURECID, VERSIYONNO, FAZ, FORM_TARIH, DURUMKODU_ID, surecId) VALUES (...

*

Сообщение об исключении предполагает, что SURECID генерируется дважды в SQL, что, по-видимому, вызывает ошибку duplicate column , однако surecId определяется один раз как свойство и аннотируетсяв качестве столбца дискриминатора в классе сущности: (см. ниже)

Базовый класс сущности имеет вид:

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(name = "surecId")
public class Surec implements java.io.Serializable {

    private static final long serialVersionUID = -6008473677883005878L;
    @Column(name = "ID")
    private Long id;
    @Basic(optional = false)
    @Column(name = "FAZ")
    private int faz;
    @Basic(optional = false)
    @Column(name = "FORM_TARIH")
    @Temporal(TemporalType.DATE)
    private Date formTarih;
    @Column(name = "PERSON_ID")
    private Integer personId;
    // @Column(name = "SURECID", updatable = false, length=17)
    @Column(updatable = false, length=17)
    private String surecId;
    @Column(name = "VERSIYONNO")
    private Long versiyonno;
    @JoinColumn(name = "DURUMKODU_ID", referencedColumnName = "ID")
    @ManyToOne
    private DurumKod durumKodu;

    public Surec() {
    }

    public Surec(String surecId) {
        this.surecId = surecId;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }
    .
    .
    .
    public String getSurecId() {
        return surecId;
    }

    public void setSurecId(String surecId) {
        this.surecId = surecId;
    }
    .
    .
    .

Я прокомментировал аннотацию "@Column (name = ..." jus toпосмотрите, не может ли это быть причиной ошибки дублирующегося столбца, но это не сработало.

А ниже - полиморфная сущность, расширяющаяся на Surec.java и выше:

@Entity
@DiscriminatorValue("atf")
public class MailOrder extends Surec {
    private static final long serialVersionUID = 8333637555543614502L;

    @Column(name = "AMOUNT")
    private Double amount;
    @Basic(optional = false)
    @Column(name = "CURRENCY", length = 17)
    private String currency;
    @Column(name = "BANK")
    private String Bank;
    @Column(name = "ACCOUNT_ID", length = 31)
    private String accountId;
    @Column(name = "INVOICE_ID")
    private Integer invoiceId;

    public MailOrder() {
    }

    public MailOrder(String surecId) {
        super(surecId);
    }

    public String getCurrency() {
        return currency;
    }
    .
    .
    .

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

Любые советы по решению проблемы (и подтверждение любого возможного EclipseLink или Oracle (или моего!)ошибка будет оценена.

Ответы [ 2 ]

3 голосов
/ 21 марта 2011

Это распространенная проблема, если у вас есть отображение отношений, которое использует это поле и связано с чувствительностью к регистру. Попробуйте указать дескриптор столбца как @DiscriminatorColumn (name = "SURECID")

EclipseLink по умолчанию чувствителен к регистру, поэтому surecId рассматривается как поле, отличное от SURECID. Вы можете сделать EclipseLink нечувствительным к регистру, используя свойство eclipselink.jpa.uppercase-column-names, которое при значении true вынуждает EclipseLink использовать верхний регистр при сравнении имен полей.

0 голосов
/ 20 марта 2011

Полагаю, вам нужно пометить свойство как insertable = false, updateable = false, так как оно уже вставлено как дискриминатор:

@Column(insertable = false, updatable = false, length=17)
private String surecId; 
...