Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.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

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 与联接表中类型的单向关联_Java_Hibernate_Mapping_Entity Relationship - Fatal编程技术网

Java 与联接表中类型的单向关联

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

我有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 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*…)。然而,他们不在这里。