根据我的研究,似乎不太可能,但这是我的用例。
我有一个名为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。
据我所知,我可以简单地将地址延迟加载,但是我有一个双层系统,一旦它通过各层就会解除所有对象。
编辑:
也许我的问题太过暧昧,但根据答案,似乎不太可能做我想做的事情。谢谢大家。
答案 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'