Java 与联接表中类型的单向关联
我有3个表:Person->Person\u Address\u Type{Person\u Address\u Type\u id(PK),Person\u id,Address\u id,Type}->Address。Person_Address_Type表示Person和Address之间的关系类型。例如:Java 与联接表中类型的单向关联,java,hibernate,mapping,entity-relationship,Java,Hibernate,Mapping,Entity Relationship,我有3个表:Person->Person\u Address\u Type{Person\u Address\u Type\u id(PK),Person\u id,Address\u id,Type}->Address。Person_Address_Type表示Person和Address之间的关系类型。例如: Mr. A has unique HOME addresses. Mr. A has one or many OFFICE addresses. Mr. A has one or ma
Mr. A has unique HOME addresses.
Mr. A has one or many OFFICE addresses.
Mr. A has one or many RELAXING addresses.
... And other types of address may be added later.
如何使用Hibernate使映射具有以下java实体:
Person {
getHomeAddress(): Address;
getOfficeAddresses(): Address*;
getRelaxingAddresses(): Address*;
}
我知道有瞬变场。然而,我们不能使用瞬态进行HQL查询。我需要一张地图。
我怎样才能做到
谢谢您的映射应该是这样的 表格结构 实体类 Person.java
@Entity
@Table(name = "person",uniqueConstraints = {
@UniqueConstraint(columnNames = "id_person")})
public class Person implements Serializable {
private static final long serialVersionUID = -1798070786993154676L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id_person", unique = true, nullable = false)
private Integer id;
@OneToMany(cascade=CascadeType.ALL)
@JoinTable(name="person_address", joinColumns={@JoinColumn(name="fk_person", referencedColumnName="id_person")}
, inverseJoinColumns={@JoinColumn(name="fk_address", referencedColumnName="id_address")})
private Set<Address> address;
// Getter and Setter methods
}
@Entity
@Table(name = "address", uniqueConstraints = {
@UniqueConstraint(columnNames = "id_address")})
public class Address implements Serializable {
private static final long serialVersionUID = -6790693372846798580L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id_address", unique = true, nullable = false)
private Integer addressId;
@OneToOne(mappedBy="address", cascade=CascadeType.ALL)
private AddressType addressType;
// Getter and Setter methods
}
AddressType.java
@Entity
@Table(name = "person",uniqueConstraints = {
@UniqueConstraint(columnNames = "id_person")})
public class Person implements Serializable {
private static final long serialVersionUID = -1798070786993154676L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id_person", unique = true, nullable = false)
private Integer id;
@OneToMany(cascade=CascadeType.ALL)
@JoinTable(name="person_address", joinColumns={@JoinColumn(name="fk_person", referencedColumnName="id_person")}
, inverseJoinColumns={@JoinColumn(name="fk_address", referencedColumnName="id_address")})
private Set<Address> address;
// Getter and Setter methods
}
@Entity
@Table(name = "address", uniqueConstraints = {
@UniqueConstraint(columnNames = "id_address")})
public class Address implements Serializable {
private static final long serialVersionUID = -6790693372846798580L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id_address", unique = true, nullable = false)
private Integer addressId;
@OneToOne(mappedBy="address", cascade=CascadeType.ALL)
private AddressType addressType;
// Getter and Setter methods
}
现在,当您调用getAddress()
时,这将返回与Person相关的所有地址,然后根据地址类型对该地址进行分组,即调用address.getAddressType().getName()
方法
根据我对Hibernate的基本了解,您还可以在Address和AddressType实体之间进行@ManyToMany映射,似乎Hibernate不直接支持关系表的样式 最简单的方法是为您的
个人地址类型创建单独的视图
,这样您就有了3个关系表,如:个人家庭地址
,个人办公室地址
,个人地址
等
每个视图只包含个人ID
和地址ID
使用这些视图,您可以使用JoinTable
执行正常的manytomy/manytone
但是,如果您希望直接使用这些实体更新关系(根据DBMS,某些DBMS允许通过视图进行更新/插入),则此方法可能不起作用
另一种方法是创建一个新实体,如PersonalAddressRelationship
,其中包含对Person的引用、地址和RelationshipType枚举
那么,这三种人际关系并没有直接映射到地址。相反,您可以根据映射的
地址关系
在@PostLoad
方法中填充家庭地址
、松弛地址
和办公地址
的值。(并且在@PrePersist
方法中更新地址关系
基于家庭地址
,放松地址
和办公地址
)我刚刚发现@WhereJoinTable是用于此的(理论上,我还没有尝试过实践)对不起。我想看到的最重要的映射是Person类中的getter(getHomeAddress():getOfficeAddresses():Address*…)。然而,他们不在这里。