Java 如何连接非主键列上的表?

Java 如何连接非主键列上的表?,java,hibernate,orm,Java,Hibernate,Orm,我对ORM类层次结构中的对象上的联接表有一个问题,因为LAGANCY数据库结构,联接列不是基类的主键。 以下是表格设计的一个示例: CREATE TABLE "SCH"."FOO" ( "OWNERID" NUMBER(10,0) NOT NULL ENABLE, "FOOID" NUMBER(10,0) NOT NULL ENABLE, CONSTRAINT "FOO_PK" PRIMARY KEY ("OWNERID

我对ORM类层次结构中的对象上的联接表有一个问题,因为LAGANCY数据库结构,联接列不是基类的主键。 以下是表格设计的一个示例:

CREATE TABLE "SCH"."FOO"
(
        "OWNERID"       NUMBER(10,0) NOT NULL ENABLE,
        "FOOID"         NUMBER(10,0) NOT NULL ENABLE,
        CONSTRAINT "FOO_PK" PRIMARY KEY ("OWNERID", "FOOID")
        CONSTRAINT "FOO_FK1" FOREIGN KEY ("OWNERID") REFERENCES "SCH"."OWNERS" ("OWNERID") ENABLE
)

CREATE TABLE "SCH"."BAR"
(
        "BARID"             NUMBER(10,0) NOT NULL ENABLE,
        "FOOID"             NUMBER(10,0)
        CONSTRAINT "BAR_PK" PRIMARY KEY ("BARID")
)
下面是映射(未删除的信息)


你能帮忙解决吗?

你可以做如下。。。。应该行得通-

@Entity
@IdClass(FooId.class)
@Table(name = "FOO")
public class Foo implements java.io.Serializable
{
    @Id
    @Column(name = "OWNERID")
    private BigInteger ownerId;

    @Id
    @SequenceGenerator(name = "FOO_GENERATOR", sequenceName = "SEQ_FOO")
    @GeneratedValue(generator = "FOO_GENERATOR")
    @Column(name = "FOOID")
    private BigInteger id;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinColumn(name = "FOOID",nullable=false)
    @ForeignKey(name = "fk")     
    private Set<Bar> bar = new LinkedHashSet<Bar>(0);
}


@Entity
@Table(name = "BAR")
public class Bar implements java.io.Serializable
{
    @Id
    @Column(name = "BARID")
    private BigInteger id;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name = "FOOID", updatable = false, insertable = false, nullable=false)  
     private Foo foo;
}
@实体
@IdClass(FooId.class)
@表(name=“FOO”)
公共类Foo实现java.io.Serializable
{
@身份证
@列(name=“OWNERID”)
私有的BigInteger所有者ID;
@身份证
@SequenceGenerator(name=“FOO\u GENERATOR”,sequenceName=“SEQ\u FOO”)
@GeneratedValue(generator=“FOO_generator”)
@列(name=“FOOID”)
私有整数id;
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY)
@JoinColumn(name=“FOOID”,nullable=false)
@外键(name=“fk”)
私有设置栏=新LinkedHashSet(0);
}
@实体
@表(name=“BAR”)
公共类栏实现java.io.Serializable
{
@身份证
@列(name=“BARID”)
私有整数id;
@manytone(fetch=FetchType.LAZY)
@JoinColumn(name=“FOOID”,updateable=false,insertable=false,nullable=false)
私人富福;
}

不得两次映射双向关联。必须使用
mappedBy
属性将单面标记为多面的倒数:

@OneToMany(fetch = FetchType.LAZY, mappedBy = "foo")
@Fetch(value = FetchMode.SUBSELECT)
@Cascade(value = {CascadeType.ALL})
private Set<Bar> bar = new LinkedHashSet<Bar>(0);

...

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "FOOID", referencedColumnName = "FOOID")
private Foo foo;
@OneToMany(fetch=FetchType.LAZY,mappedBy=“foo”)
@Fetch(值=FetchMode.SUBSELECT)
@级联(值={CascadeType.ALL})
私有设置栏=新LinkedHashSet(0);
...
@manytone(fetch=FetchType.LAZY)
@JoinColumn(name=“FOOID”,referencedColumnName=“FOOID”)
私人富福;
没有理由告诉Hibernate两次关联是由联接列FOOID映射的。这样做实际上是一个错误,因为它定义了两个不同的单向关联,而不是一个双向关联

编辑 上面的方法应该可以工作,但由于以下Hibernate错误而不能工作:这是一个Hibernate错误。看


为了避免此问题,由于
FOOID
足以确保唯一性,解决方案是从所有者Id和
@IdClass
注释中删除
@Id
注释。

您在FOO表中使用了复合主键。所以,您应该尝试@EmbeddedId属性,并且在与FOO实体连接的BAR实体中需要两列“OWNER\u ID”和“FOO\u ID”

不工作,表示:从com.package.Bar引用com.package.Foo的外键列号错误。应该在这之前尝试一下,不起作用:com.package.Bar.foo的referencedColumnNames(FOOID)引用com.package.foo未映射到单个属性这是一个Hibernate错误。看见OTOH,你不能简单地从所有者Id中删除@Id注释,因为FOOID足以确保唯一性吗?从所有者Id中删除@Id注释并删除@IdClass是可行的,但效果并不理想,但不知怎么的。你能不能把它作为一个不同的答案发布,这样我就可以接受它作为一个解决方案?非常感谢。引用的错误在2013年因不可复制而关闭。我知道,但我无法更改数据库结构:(
@Entity
@IdClass(FooId.class)
@Table(name = "FOO")
public class Foo implements java.io.Serializable
{
    @Id
    @Column(name = "OWNERID")
    private BigInteger ownerId;

    @Id
    @SequenceGenerator(name = "FOO_GENERATOR", sequenceName = "SEQ_FOO")
    @GeneratedValue(generator = "FOO_GENERATOR")
    @Column(name = "FOOID")
    private BigInteger id;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinColumn(name = "FOOID",nullable=false)
    @ForeignKey(name = "fk")     
    private Set<Bar> bar = new LinkedHashSet<Bar>(0);
}


@Entity
@Table(name = "BAR")
public class Bar implements java.io.Serializable
{
    @Id
    @Column(name = "BARID")
    private BigInteger id;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name = "FOOID", updatable = false, insertable = false, nullable=false)  
     private Foo foo;
}
@OneToMany(fetch = FetchType.LAZY, mappedBy = "foo")
@Fetch(value = FetchMode.SUBSELECT)
@Cascade(value = {CascadeType.ALL})
private Set<Bar> bar = new LinkedHashSet<Bar>(0);

...

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "FOOID", referencedColumnName = "FOOID")
private Foo foo;