Hibernate OneToMany с помощью аннотаций с унаследованной базой данных

голоса
2

Я работаю с устаревшей базой данных, которая не нормируется вообще. Они были кодирования отношения непосредственно в программе (написанной в Uniface). Теперь они переходят на Java. К сожалению, я не могу изменить базу данных, но мне нужно отобразить OneToMany отношения между таблицами.

Например, у меня есть таблица счет-фактура и таблица элементы.

Таблица счет имеет следующие ключи. Первые три из них используются в качестве внешних ключей для отношений с пунктом:

invoice_serial_id,  
invoice_number_id,  
invoice_date,
invoice_otherkey1,
invoice_otherkey2  

Таблица Пункт имеет следующие ключи, то первые три имеет один и тот же тип и значение , чем их соответствующие ключи счетов - фактуры.

item_serial_id,
item_number_id,
item_date,
item_otherkey1

Я создал таблицы с использованием обратного проектирования из спящего режима, которые генерируются Invoice.java, InvoiceId.java, Item.java и ItemId.java, затем вручную созданное @OneToMany и @ManyToOne аннотация. Вот код до сих пор:

Invoice.java

@Entity
@Table(name = INVOICE)
public class Invoice implements java.io.Serializable {

    private static final long serialVersionUID = -2073462863929322522L;

    @EmbeddedId
        @AttributeOverrides( {
            @AttributeOverride(name = invoiceSerialId, column = @Column(name = INVOICE_SERIAL_ID, nullable = false, length = 9)),
            @AttributeOverride(name = invoiceNumberId, column = @Column(name = INVOICE_NUMBER_ID, nullable = false, length = 9)),
            @AttributeOverride(name = invoiceDate, column = @Column(name = INVOICE_DATE, nullable = false, length = 7)),
            @AttributeOverride(name = invoiceOtherkey1, column = @Column(name = INVOICE_OTHERKEY1, nullable = false, length = 7)),
            @AttributeOverride(name = invoiceOtherkey2, column = @Column(name = INVOICE_OTHERKEY2, nullable = false, length = 7))
    })
    private InvoiceId id;

    @OneToMany(mappedBy = invoice)
    private Set<Item> items;
}

Item.java

@Entity
@Table(name = ITEM)
public class Item implements java.io.Serializable {
    private static final long serialVersionUID = -2840038244580784867L;

    @EmbeddedId
        @AttributeOverrides( {
            @AttributeOverride(name = itemSerialId, column = @Column(name = ITEM_SERIAL_ID, nullable = false, length = 9)),
            @AttributeOverride(name = itemNumberId, column = @Column(name = ITEM_NUMBER_ID, nullable = false, length = 9)),
            @AttributeOverride(name = itemDate, column = @Column(name = ITEM_DATE, nullable = false, length = 7)),
            @AttributeOverride(name = itemOtherkey1, column = @Column(name = ITEM_OTHERKEY1, nullable = false, length = 7))
    })
    private ItemId id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumns({
        @JoinColumn(name = ITEM_SERIAL_ID, referencedColumnName = INVOICE_SERIAL_ID),
        @JoinColumn(name = ITEM_NUMBER_ID, referencedColumnName = INVOICE_NUMBER_ID),
        @JoinColumn(name = ITEM_DATE, referencedColumnName = INVOICE_DATE)
    })
    private Invoice invoice;
}

Я получаю следующее сообщение об ошибке:

org.hibernate.AnnotationException: referencedColumnNames(INVOICE_SERIAL_ID, INVOICE_NUMBER_ID, INVOICE_DATE) of com.just.an.stupid.example.app.Item.invoice referencing com.just.an.stupid.example.app.Invoice not mapped to a single property

Я также попытался следующие шаги здесь , и создать @joinTable на счете - фактуре , таких как

@JoinTable(name = INVOICE_ITEM,
    joinColumns = {
        @JoinColumn(name = ITEM_SERIAL_ID, referencedColumnName = INVOICE_SERIAL_ID),
        @JoinColumn(name = ITEM_NUMBER_ID, referencedColumnName = INVOICE_NUMBER_ID),
        @JoinColumn(name = ITEM_DATE, referencedColumnName = INVOICE_DATE)
    },
    inverseJoinColumns = {
        @JoinColumn(name = INVOICE_SERIAL_ID, referencedColumnName = ITEM_SERIAL_ID),
        @JoinColumn(name = INVOICE_NUMBER_ID, referencedColumnName = ITEM_NUMBER_ID),
        @JoinColumn(name = INVOICE_DATE, referencedColumnName = ITEM_DATE)
    }
)

но я получил это:

org.hibernate.AnnotationException: A Foreign key refering com.just.an.stupid.example.app.Invoice from com.just.an.stupid.example.app.Item has the wrong number of column. should be 5

Как я могу создать отношения с помощью этой базы данных? Или я должен отказаться и вручную выбрать товары?

Задан 15/11/2011 в 11:13
пользователем
На других языках...                            


2 ответов

голоса
0

YI думаю, что вам нужно сделать это.

  1. Ваша таблица счет-фактура имеет первичный ключ с соответствующим атрибутом @Id.

  2. Встроенный ID в таблице счета должен содержать только 3 поля, которые присутствуют в таблице Item.

  3. Создайте Itemid таблицу, которая MAPPS эти три поля, и ссылаться на это в таблице счетов.

она будет выглядеть следующим образом ....

@Embeddable
public class ItemId implements java.io.Serializable {

private Long serialNo;
private Long itemNumber;
    private Date itemDate

........ с соответствующими сеттеры и геттеры и overried в хэш-код () и Equals (Object о) для класса ItemId.

  1. В вашем счете-фактуре ссылка на это ItemId (как вы делаете с embeddedId и атрибуты переопределения.

На данный момент, вы встраивание 5 полей в определении внешнего ключа, но только напряжение 3 в классе Itemid. Вам не нужно присоединиться к таблице, вы только создание составного ключа класса (содержащего 3 поля) и встраивание этого в таблице счета.

Ответил 15/11/2011 в 11:53
источник пользователем

голоса
1

Из-за нехватки времени я не мог ждать правильного ответа.

Я в конечном итоге создать представление, соединяющее эти таблицы в примере, как, например:

create or replace table invoice_items as
select distinct
  i.field_1,
  i.field_2,
  i.field_3,
  it.field_4
from
  invoice i
inner join
  item it
on
  (i.invoice_serial_id = it.item_serial_id and
   i.invoice_number_id = it.item_number_id and
   i.invoice_date = it.item_date
  )

Тогда я отображаюсь вид в спящем режиме. Это то, что работает для меня.

Ответил 17/11/2011 в 10:15
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more