我刚刚开始在冬眠时湿透了脚。我一直在关注hibernate的在线hibernate教程。在课程中,创建了两个类; UserDetails,地址。 UserDetails类使用@Entity批注,而Address类使用@Embeddable批注。
使用UserDetails类中的@GenericGenerator和@CollectionId注释而不是创建主键" ADDRESS_ID"而不是声明实例变量更简单,更实用(在Address类中使用private int ADDRESS_ID,并使用@Id @GeneratedValue注释使变量成为USER_ADDRESS表的主键?
由于
UserDetails.java
package dto;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.AttributeOverride;
import javax.persistence.AttributeOverrides;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Embeddable;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.Lob;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import org.hibernate.annotations.CollectionId;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Type;
@Entity
public class UserDetails {
@Id
@Column
private int userId;
@Column
private String userName;
@ElementCollection
@JoinTable(name="USER_ADDRESS", joinColumns=@JoinColumn(name="USER_ID"))
@GenericGenerator(name = "sequence-gen", strategy = "sequence")
@CollectionId(columns = { @Column(name="ADDRESS_ID") }, generator = "sequence-gen", type = @Type(type="long"))
private Collection<Address> listOfAddresses = new ArrayList<Address>();
public Collection<Address> getListOfAddresses() {
return listOfAddresses;
}
public void setListOfAddresses(Collection<Address> listOfAddresses) {
this.listOfAddresses = listOfAddresses;
}
public Date getJoinedDate() {
return joinedDate;
}
public void setJoinedDate(Date joinedDate) {
this.joinedDate = joinedDate;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
Address.java
package dto;
import javax.persistence.Column;
import javax.persistence.Embeddable;
@Embeddable
public class Address {
@Column(name="STREET_NAME")
private String street;
@Column(name="CITY_NAME")
private String city;
@Column(name="STATE_NAME")
private String state;
@Column(name="PIN_CODE")
private String pincode;
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public String getPincode() {
return pincode;
}
public void setPincode(String pincode) {
this.pincode = pincode;
}
}
答案 0 :(得分:0)
可嵌入类型是一种值类型,您也可以找到术语:组件。这些对象不是实体,而只是实体的一部分,这意味着它们的生命周期与实体绑定。
根据休眠doc
embeddable类型没有任何身份,由他们管理 拥有实体。
你进行的方式似乎是一种很好的做法。
答案 1 :(得分:0)
实际上,在嵌入式类型中不需要Id
属性(在Hibernate中称为组件),因为它们是&#39;只是一个值组合并且它们不支持共享引用,所以即使两个对象包含相同的组件值它们也不会是相同的引用但只有两个具有相同值的对象,您可以从Hibernate Component Mapping:
与值类型一样,组件不支持共享引用。换句话说,两个人可以具有相同的名称,但是这两个人对象将包含两个独立的名称对象,这些对象只是&#34;相同的&#34;按价值。组件的空值语义是临时的。当重新加载包含对象时,Hibernate将假设如果所有组件列都为null,则整个组件为null。这适用于大多数用途。
所以基本上这里不需要Id
属性。
但回答你关于哪种方法更好的问题?
我认为他们做的完全相同,但在你的@Id
实体中使用@GeneratedValue
和Address
会比你说的要简单得多,最重要的是它会更加实用,因为您不必在包含@CollectionId
组件的每个实体中使用Adress
重新定义此项,因此项目中的代码将更少,更清晰。
因此,在@Id
实体中使用Adress
将是performance
,readability
和maintainability
的最佳方式。