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