Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate OneToMany使用遗留数据库的注释_Java_Hibernate_Annotations_One To Many - Fatal编程技术网

Java Hibernate OneToMany使用遗留数据库的注释

Java Hibernate OneToMany使用遗留数据库的注释,java,hibernate,annotations,one-to-many,Java,Hibernate,Annotations,One To Many,我使用的是一个根本没有规范化的遗留数据库。他们直接在程序中对关系进行编码(用Uniface编写)。现在,他们正在迁移到Java。遗憾的是,我无法更改数据库,但我需要映射表之间的一对一关系 例如,我有一张表格发票和一个表格项目 表发票包含这些键。其中前三个用作与项的关系的外键: invoice_serial_id, invoice_number_id, invoice_date, invoice_otherkey1, invoice_otherkey2 表项具有这些键,前三个键的类型

我使用的是一个根本没有规范化的遗留数据库。他们直接在程序中对关系进行编码(用Uniface编写)。现在,他们正在迁移到Java。遗憾的是,我无法更改数据库,但我需要映射表之间的一对一关系

例如,我有一张表格发票和一个表格项目

发票包含这些键。其中前三个用作与项的关系的外键:

invoice_serial_id,  
invoice_number_id,  
invoice_date,
invoice_otherkey1,
invoice_otherkey2  
具有这些键,前三个键的类型和值与其对应的发票键相同

item_serial_id,
item_number_id,
item_date,
item_otherkey1
我使用hibernate的反向工程创建了这些表,它生成Invoice.java、InvoiceId.java、Item.java和ItemId.java,然后手动创建@OneToMany和@ManyToOne注释。以下是迄今为止的代码:

Invoice.java

@实体
@表(name=“发票”)
公共类Invoice实现java.io.Serializable{
私有静态最终长SerialVersionId=-2073462929322522L;
@嵌入ID
@属性超过({
@AttributeOverride(name=“invoiceSerialId”,column=@column(name=“INVOICE\u SERIAL\u ID”,nullable=false,length=9)),
@AttributeOverride(name=“invoiceNumberId”,column=@column(name=“INVOICE\u NUMBER\u ID”,nullable=false,length=9)),
@AttributeOverride(name=“invoiceDate”,column=@column(name=“INVOICE\u DATE”,nullable=false,length=7)),
@AttributeOverride(name=“invoiceOtherkey1”,column=@column(name=“INVOICE\u OTHERKEY1”,nullable=false,length=7)),
@AttributeOverride(name=“invoiceOtherkey2”,column=@column(name=“INVOICE\u OTHERKEY2”,nullable=false,length=7))
})
私人发票id;
@OneToMany(mappedBy=“发票”)
私人设置项目;
}
Item.java

@实体
@表(name=“ITEM”)
公共类项实现java.io.Serializable{
私有静态最终长serialVersionUID=-2840038244580784867L;
@嵌入ID
@属性超过({
@AttributeOverride(name=“itemSerialId”,column=@column(name=“ITEM\u SERIAL\u ID”,nullable=false,length=9)),
@AttributeOverride(name=“itemNumberId”,column=@column(name=“ITEM\u NUMBER\u ID”,nullable=false,length=9)),
@AttributeOverride(name=“itemDate”,column=@column(name=“ITEM\u DATE”,nullable=false,length=7)),
@AttributeOverride(name=“itemOtherkey1”,column=@column(name=“ITEM\u OTHERKEY1”,nullable=false,length=7))
})
私有ItemId;
@manytone(fetch=FetchType.LAZY)
@连接柱({
@JoinColumn(name=“ITEM\u SERIAL\u ID”,referencedColumnName=“INVOICE\u SERIAL\u ID”),
@JoinColumn(name=“物料编号”\u ID),referencedColumnName=“发票编号”\u ID),
@JoinColumn(name=“项目\日期”,referencedColumnName=“发票\日期”)
})
私人发票;
}
我得到以下错误:

org.hibernate.AnnotationException:com.just.an.dumby.example.app.Item.INVOICE referenced com.just.an.dumby.example.app.INVOICE的引用列名称(发票编号、发票编号、发票日期)未映射到单个属性
我还尝试了以下步骤,并在发票上创建@joinTable,例如

@JoinTable(name=“发票\项目”,
joinColumns={
@JoinColumn(name=“ITEM\u SERIAL\u ID”,referencedColumnName=“INVOICE\u SERIAL\u ID”),
@JoinColumn(name=“物料编号”\u ID),referencedColumnName=“发票编号”\u ID),
@JoinColumn(name=“项目\日期”,referencedColumnName=“发票\日期”)
},
反向连接列={
@JoinColumn(name=“发票序列号”,referencedColumnName=“项目序列号”),
@JoinColumn(name=“发票号”\u ID),referencedColumnName=“项目号”\u ID),
@JoinColumn(name=“发票日期”,referencedColumnName=“项目日期”)
}
)
但我明白了:

org.hibernate.AnnotationException:com.just.an.dumby.example.app.Item中引用com.just.an.dumby.app.Invoice的外键的列号错误。应该是5岁

如何使用此数据库创建关系?还是我应该放弃并手动选择项目?

我认为您需要这样做

  • 您的发票表有一个具有相应@ID属性的主键

  • 发票表中的嵌入ID应仅包含项目表中的3个字段

  • 创建一个ItemID表,映射这三个字段,并在Invoice表中引用它

  • 看起来像这样

    @Embeddable
    public class ItemId implements java.io.Serializable {
    
    private Long serialNo;
    private Long itemNumber;
        private Date itemDate
    
    。。。。。。。。 使用相应的setter和getter,并对ItemId类的hashCode()和equals(Object o)进行了过度求值

  • 在您的发票中引用此ItemId(就像您使用embeddedId和属性覆盖所做的那样)

  • 目前,您在外键定义中嵌入了5个字段,但在itemID类中只强调了3个字段。您不需要联接表,只需要创建一个复合键类(包含3个字段)并将其嵌入发票表。

    由于时间限制,我无法等待正确的答案

    我最终创建了一个视图,将示例中的表连接起来,如下所示:

    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
      )
    

    然后我在Hibernate中映射了视图。这对我来说很有用。

    嗨,谢谢你的回答!很遗憾,我不能这样做,因为这些表将用于其他关系中。我想我不能用正确的方法。