Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.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 如何在hibernate中将多个类映射到一个表?_Java_Hibernate - Fatal编程技术网

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

Java 如何在hibernate中将多个类映射到一个表?,java,hibernate,Java,Hibernate,从我的研究来看,这似乎不太可能,但这是我的用例 我有一个名为user的表,它有一个地址id 我想将UserReference和User类映射到此表,其中UserReference不包含Address对象(以节省sql连接时间),而User包含Address对象(以防需要) 我不能使用,因为它需要一个联接表,我不能只定义两个单独的类,因为get()似乎返回每行的两倍(一个用于用户,一个用于用户引用) 有人知道我该怎么做吗 我想我应该试着更好地解释我自己 public class UserRefe

从我的研究来看,这似乎不太可能,但这是我的用例

我有一个名为user的表,它有一个地址id

我想将UserReference和User类映射到此表,其中UserReference不包含Address对象(以节省sql连接时间),而User包含Address对象(以防需要)

我不能使用,因为它需要一个联接表,我不能只定义两个单独的类,因为get()似乎返回每行的两倍(一个用于用户,一个用于用户引用)

有人知道我该怎么做吗


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

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

public class User extends UserReference {
    private Address;
}
我想同时映射UserReference和User,这样当我只需要基本的细节时就可以查询UserReference,当我需要完整的对象时就可以查询User

我知道我可以简单地让地址延迟加载,但我有一个两层系统,一旦它通过层,就会取消所有对象的加密


编辑:

也许我的问题太含糊不清了,但根据答案,似乎不太可能做我想做的事。谢谢大家。

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;

}

你的问题我不太清楚,但我会根据我的理解尽力回答。这取决于您真正想要持久化什么,以及作为java实体想要什么

假设您希望用数据库表表示用户类,即在JPA中将用户表示为实体。现在您可以创建一个可嵌入类,它将是另一个类的一部分

因此,您可以在用户实体中映射地址类,并使用 包com.thejavageek.embeddedabledemo

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

}

我想你的意思是你有一张像

USER
- USER_ID
- USER_NAME
- ADDRESS_ID

像这样的

您希望有2个
User
实体,其中一个包含对地址的引用,而另一个不包含(因此,正如您所说,它节省了SQL连接时间),我的理解正确吗

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

只需拥有一个
用户
实体,并将其
地址
关系延迟获取即可

如果在任何函数中您需要
用户中的
地址
,请执行加入获取

e、 g

在这种情况下,对
用户
的所有正常检索都不会引起对
地址
表的任何连接。但是,它可以灵活地执行以下操作

from User u left join fetch u.address where u.name like 'blabala'

原始海报真的想要继承吗?实际上,将同一个表映射到多个实体是绝对正确的。然而,如果你用这种方法解决“非固定”问题(我打赌你的意思是你在浏览整个对象图?),你将在未来陷入深深的麻烦,特别是你有更复杂的对象关系,在不同的功能中,你需要不同的关系组合。嗯,你能进一步解释为什么这可能是一个问题吗?例如,如果你的系统继续增长,你可能有一个实体a与B、C、D和E有关系。你可能有不同的功能,功能1只需要a,功能2需要A+B,功能3需要A+C+D,功能4需要A+C+E等。通过使用您的方法,您需要有不同形式的实体来应对不同功能的使用。这将是一个维护的噩梦,抓取会起作用,除了我有一个多层系统,它通过了预期要抓取地址对象的层。这不会是一个问题。多年来我一直在做同样的事情。你有两个选择:1。确保对于需要地址的函数,在将对象返回到事务边界之外之前,已经获取了地址(通过join-fetch等)。或者,2。在从txn边界返回之前,构造一个非持久相关值对象。还有其他方法,如在视图中打开会话或使用jpa impl,允许在没有活动txn的情况下进行延迟获取。我个人不喜欢这种方式。
@Entity
public class User {
    @Id
    private Long id;

    private String name;

    @ManyToOne(fetch=FetchType.LAZY)
    private Address address;
}
from User u left join fetch u.address where u.name like 'blabala'