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