如何将多个类Map到Hibernate中的一个表?

2ic8powd  于 2023-10-23  发布在  其他
关注(0)|答案(3)|浏览(125)

从我的研究来看,这似乎不太可能,但这是我的用例。
我有一个名为user的表,它有一个地址id。
我想将一个UserReference和User类Map到这个表,其中UserReference不包含Address对象(以保存sql连接时间),User * 包含Address对象(以防需要)。
我不能使用 subclass,因为它需要一个连接表,我不能只定义两个单独的类,因为get()似乎返回每行的双精度值(一个用于User,一个用于UserReference)。
有人知道我该怎么做吗?
我想我应该试着更好地解释自己。

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

public class User extends UserReference {
    private Address;
}

我想MapUserReference和User,这样当我只需要基本的细节时就可以查询UserReference,而当我需要完整的对象时就可以查询User。
我知道我可以简单地让Address延迟加载,但是我有一个两层系统,一旦它通过层,它就会取消所有对象的代理。
编辑:
也许我的问题太过含糊,但从答案来看,似乎不太可能做到我想要的。无论如何,谢谢大家。

b91juud3

b91juud31#

你的问题我不太清楚,但我会尽量按照我的理解来回答。这取决于你真正想要持久化什么,以及你想要什么作为一个java实体。
假设你想用一个数据库表来表示User类,即在JPA中将User表示为实体。现在你可以创建一个嵌入类,它将成为另一个类的一部分。
因此,您可以在User Entity中Map一个Address类,并使用@Embeddable注解包com.thejavageek.embeddabledemo使Address类成为可嵌入的;

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;
    }

}
m3eecexj

m3eecexj2#

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;

}
9cbw7uwe

9cbw7uwe3#

我想你的意思是你有一张table,

USER
- USER_ID
- USER_NAME
- ADDRESS_ID

ADDRESS
- ADDRESS_ID
- ADDRESS_DETAIL

类似的东西吗
你想有2个User实体,其中一个包含对Address的引用,另一个没有(所以它保存SQL连接时间,正如你所说的),我的理解正确吗?
如果是这样,你不需要这样做。
只需有一个User实体,并将其Address关系放置为LAZY获取。
如果在任何函数中,您需要User中的Address,请执行join fetch。
例如

@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'

相关问题