如何在hibernate中将多个类映射到一个表?

时间:2015-04-15 16:06:35

标签: java hibernate

根据我的研究,似乎不太可能,但这是我的用例。

我有一个名为user的表,其地址为。

我想将UserReference和User类映射到此表,其中UserReference不包含Address对象(以保存sql加入时间),而User 包含Address对象(如果它是需要)。

我无法使用,因为它需要连接表,我不能只定义两个单独的类,因为get()似乎返回每行的两倍(一个用于User,一个用于UserReference)。

有谁知道我怎么能这样做?


我想我应该尝试更好地解释自己。

public class UserReference {
    private int id;
    private String name;
}

public class User extends UserReference {
    private Address;
}

我想映射UserReference和User,以便在我只需要基本详细信息时可以查询UserReference,并在需要完整对象时查询User。

据我所知,我可以简单地将地址延迟加载,但是我有一个双层系统,一旦它通过各层就会解除所有对象。


编辑:

也许我的问题太过暧昧,但根据答案,似乎不太可能做我想做的事情。谢谢大家。

3 个答案:

答案 0 :(得分:4)

UserReference.java

@Entity
@DiscriminatorColumn(name = "type")
@DiscriminatorValue(value = "UserReference")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class UserReference extends BaseEntity {

    private String name;
}

User.java

@Entity
@DiscriminatorValue(value = "User")
public class User extends UserReference {
    @OneToOne
    @JoinColumn(name = "address_id")
    private Address address;

}

答案 1 :(得分:2)

你的问题对我来说不是很清楚,但我会按照我的理解尝试回答。这取决于你真正想要坚持的内容以及你想要的java实体。

考虑您要使用数据库表来表示User类,即在JPA中将User表示为实体。现在您可以创建一个Embeddable类,它将成为另一个类的一部分。

因此,您可以在User Entity中映射Address类,并使用@Embeddable annotation将Address类设置为Embeddable 包com.thejavageek.embeddabledemo;

import javax.persistence.Embeddable;

@Embeddable
public class Address {

    private String area;
    private String city;
    private String pincode;

    public String getArea() {
        return area;
    }

    public void setArea(String area) {
        this.area = area;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getPincode() {
        return pincode;
    }

    public void setPincode(String pincode) {
        this.pincode = pincode;
    }

}

您可以将此嵌入类嵌入如下

package com.thejavageek.embeddabledemo;

import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.TableGenerator;

@Entity
public class Person {

    @TableGenerator(name = "person_gen", table = "id_gen", pkColumnName = "gen_name", valueColumnName = "gen_val", allocationSize = 100)
    @Id
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "person_gen")
    private String idperson;
    private String name;

    @Embedded
    private Address address;

    public String getIdperson() {
        return idperson;
    }

    public void setIdperson(String idperson) {
        this.idperson = idperson;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

}

答案 2 :(得分:0)

我觉得你的意思是你有一张像

这样的表
USER
- USER_ID
- USER_NAME
- ADDRESS_ID

ADDRESS
- ADDRESS_ID
- ADDRESS_DETAIL

类似的东西?

你想拥有2个User个实体,其中一个包含对Address的引用而另一个没有(因此它保存SQL连接时间,如你所说),我的理解是否正确?

如果是这样,您不需要这样做。

只需拥有一个User实体,并将其Address关系设为LAZY。

如果您在Address中需要User的任何功能,请进行联接提取。

e.g。

@Entity
public class User {
    @Id
    private Long id;

    private String name;

    @ManyToOne(fetch=FetchType.LAZY)
    private Address address;
}

在这种情况下,User的所有正常检索都不会导致Address表的任何连接。但是,做

之类的事情是很灵活的
from User u left join fetch u.address where u.name like 'blabala'