Hibernate非标准连接给出了org.hibernate.AnnotationException:referencedColumnNames

时间:2015-12-21 23:41:31

标签: java oracle hibernate

以下是有问题的表格

table1 -

CONTACT:

UNIVERSAL_ID (pk, Number(8,0)),
CONTACT_ID (pk, Number(4,0))

table2 -

ADDRESS:

UNIVERSAL_ID (pk, Number(8,0)),
ADDRESS_ID (pk, Number(4,0)),
ADDRESS_TYPE (fk, CHAR(3 BYTE))

表3 -

ADDRESS_TYPE:

ADDRESS_TYPE (pk, CHAR(3 BYTE))

尝试实现类似于以下sql的东西:

SELECT * FROM  Address A, CONTACT C WHERE A.UNIVERSAL_ID =C.UNIVERSAL_ID AND A.ADDRESS_TYPE='BB';

实体类:

联络 -

@Table(name = "CONTACT")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class ContactRole  {
@EmbeddedId
private ContactPK id;

@ManyToOne
@NotFound(action = NotFoundAction.IGNORE)
@JoinColumnsOrFormulas({
        @JoinColumnOrFormula(formula = @JoinFormula(value = "(SELECT A.ADDRESS_TYPE FROM ADDRESS A WHERE A.UNIVERSAL_ID = UNIVERSAL_ID AND A.ADDRESS_TYPE = 'BB')",referencedColumnName = "ADDRESS_TYPE")),
        @JoinColumnOrFormula(column = @JoinColumn(name = "UNIVERSAL_ID", referencedColumnName = "UNIVERSAL_ID", insertable = false, updatable = false))
})
private ContactAddress contactAddressBB;

}

主键类

@Embeddable
public class ContactPK implements IPrimaryKey {

@Column(name = "UNIVERSAL_ID", nullable = false)
private Long uId;

@Column(name = "CONTACT_ID", nullable = false)
private Long contactId;

public ContactPK() {
}

public ContactPK(Long uId, Long contactId) {
    super();
    this.uId = uId;
    this.contactId = contactId;
}

}

联系地址 -

@Entity
@DiscriminatorValue("CONTACT")
public class ContactAddress extends BaseAddress {

private static final long serialVersionUID = 1L;
}

基地址 -

@Entity
@Table(name = "ADDRESS")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorOptions(force=true)
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class BaseAddress {

    @EmbeddedId
        private AddressPK id;

    @OneToOne
        @NotFound(action = NotFoundAction.IGNORE)
    @JoinColumn(name = "ADDRESS_TYPE", referencedColumnName = "ADDRESS_TYPE")
        private AddressType addressType;

}

地址PK -

@Embeddable
public class AddressPK implements IPrimaryKey {

@Column(name = "UNIVERSAL_ID", nullable = false)
    private Long uId;

    @Column(name = "ADDRESS_ID", nullable = false)
    private Long addressId

    public AddressPK () {
    }

    public AddressPK (Long uId, Long addressId{
        super();
        this.uId = uId;
        this.addressId = addressId
    }

}

地址类型

@Entity
@Table(name = "ADDRESS_TYPE")
public class AddressType 
{
        @Id
        @Column(name = "ADDRESS_TYPE")
        private String addressType;
}

当应用初始化时,我得到

Caused by: org.hibernate.AnnotationException: referencedColumnNames(ADDRESS_TYPE, UNIVERSAL_ID) of org.ContactRole.contactAddressBB referencing org.address.ContactAddress not mapped to a single property

我理解数据库设计可能存在缺陷,但不幸的是我必须使用它,因此任何帮助都将受到赞赏。如果没有可用的直接解决方案,即使是以不同的方式做出建议也会有所帮助。

0 个答案:

没有答案