org.hibernate.MappingException: не удалось определить тип для: java.util.Set, в таблице: USERS, для столбцов: [org.hibernate.mapping.Column(invoices)]

У меня проблема, что Hibernate не может определить тип для Set в таблице USERS. Я пытаюсь создать внешний ключ таблицы INVOICES через отношение «один ко многим». Один пользователь может генерировать множество счетов-фактур. Мой User.java приведен ниже.

@Entity
@Table(name="USERS")
public class User {

    @Id
    @Column(name="User_Id",nullable=false)
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Integer user_id;


    @Column(name="NAME")
    private String name;

    @Column(name="Address")
    private String address;

    @Column(name="Designation")
    private String designation;


    private Set<Invoice> invoices;

    /*@OneToMany
    @JoinColumn(name="Rec_Invoice_ID", nullable=false)
    private Set<RecurringInvoice> recurring_invoices;*/

Я пытаюсь использовать INVOICE-ID в качестве внешнего ключа в таблице USERS. Я следую приведенным здесь инструкциям Hibernate: Annotation one-to-many (иностранные ключ)

    @OneToMany
    @JoinColumn(name="INVOICE_ID", nullable=false)
    public Set<Invoice> getInvoices() {
        return invoices;
    }

    public void setInvoices(Set<Invoice> invoices) {
        this.invoices = invoices;
    }

/*   public Set<RecurringInvoice> getRecurring_invoices() {
        return recurring_invoices;
    }

    public void setRecurring_invoices(Set<RecurringInvoice> recurring_invoices) {
        this.recurring_invoices = recurring_invoices;
    }
*/
    // Getters and Setters
    public Integer getUser_id() {
        return user_id;
    }

    public void setUser_id(Integer user_id) {
        this.user_id = user_id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getDesignation() {
        return designation;
    }

    public void setDesignation(String designation) {
        this.designation = designation;
    }

}

Мой Invoice.java приведен ниже.

@Entity
@Table(name="INVOICES")
public class Invoice {


    private Integer invoice_id;

    @Column(name="Date_Created", nullable=false)
    private Timestamp dateCreated;

    @Column(name="DESCRIPTION")
    private String description;

    @Column(name="Total_Amount")
    private Double totalAmount;

    @Column(name="Tax_Amount")
    private Double taxAmount;

    @Column(name="Due_Date")
    private Timestamp dueDate;

    @Column(name="deleted")
    private boolean deleted;


    private InvoiceItemsDetails invoiceItemsDetails;


    private Client client;

    @OneToOne
    @JoinColumn(name="ID", nullable=false)
    public Client getClient() {
        return client;
    }

    public void setClient(Client client) {
        this.client = client;
    }

    public Date getDueDate() {
        return dueDate;
    }

    public void setDueDate(Timestamp dueDate) {
        this.dueDate = dueDate;
    }

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="INVOICE_ID", nullable=false, insertable=false,updatable=false)
    public Integer getInvoice_id() {
        return invoice_id;
    }

    public void setInvoice_id(Integer invoice_id) {
        this.invoice_id = invoice_id;
    }

    public Date getDateCreated() {
        return dateCreated;
    }

    public void setDateCreated(Timestamp dateCreated) {
        this.dateCreated = dateCreated;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Double getTotalAmount() {
        return totalAmount;
    }

    public void setTotalAmount(Double totalAmount) {
        this.totalAmount = totalAmount;
    }

    public Double getTaxAmount() {
        return taxAmount;
    }

    public void setTaxAmount(Double taxAmount) {
        this.taxAmount = taxAmount;
    }

    public boolean isDeleted() {
        return deleted;
    }

    public void setDeleted(boolean deleted) {
        this.deleted = deleted;
    }

    @OneToOne
    @JoinColumn(name="Invoice_Item_Detail_id", nullable=false)
    public InvoiceItemsDetails getInvoiceItemsDetails() {
        return invoiceItemsDetails;
    }

    public void setInvoiceItemsDetails(InvoiceItemsDetails invoiceItemsDetails) {
        this.invoiceItemsDetails = invoiceItemsDetails;
    }


}

person user2251798    schedule 06.04.2013    source источник


Ответы (1)


Если я правильно помню, Hibernate не позволяет вам смешивать и сопоставлять аннотации в сочетании с полем/геттером. Если ваша аннотация @Id установлена ​​над полем, все ваши сопоставления должны следовать полям. Попробуйте переместить @OneToMany @JoinColumn(name="INVOICE_ID", nullable=false) с getInvoices() на private Set<Invoice> invoices; Этот шаблон следует применить и к вашему Invoice классу.

person Ori Dar    schedule 06.04.2013
comment
Здравствуйте, я сделал то, что вы сказали, но теперь я получаю новое исключение org.hibernate.MappingException: повторяющийся столбец в сопоставлении для объекта: столбец net.impetus.dto.Invoice: INVOICE_ID (должен быть сопоставлен с вставкой = ложное обновление = ложный) - person user2251798; 06.04.2013
comment
Это связано с тем, что поле invoice_id также сопоставлено с тем же именем столбца: @Column(name="INVOICE_ID"... Измените имя столбца FK на что-то вроде @OneToMany @JoinColumn(name="USER_ID", nullable=false) private Set<Invoice> invoices; - person Ori Dar; 06.04.2013
comment
Отличный ответ - решил ту же проблему, что и в моей среде. - person John Lockwood; 08.02.2014
comment
спасибо, это помогло мне решить проблему в моем коде, +1 - person Pankaj Sharma; 07.04.2014
comment
Блестящий. Как педантично однако! - person Ravish Bhagdev; 12.08.2014
comment
Спасибо, чувак, это причинило бы много боли, если бы я не нашел это достаточно быстро! Вы можете искать много вещей, прежде чем пытаться определить все свои аннотации в одном и том же месте, думая, что это может вызвать проблемы, связанные с смешиванием полей/геттеров... - person Christophe Schutz; 05.08.2015
comment
@OriDar Спасибо за это объяснение, очень полезно! - person corecase; 09.07.2016