Hibernate 如何为可嵌入类生成id?
注意:很多文件 既然我不能在保持文件可嵌入的同时用@id对其进行注释,那么我如何在文件中分配id?当前,文件表中的id为空 注Hibernate 如何为可嵌入类生成id?,hibernate,spring-data,spring-data-jpa,Hibernate,Spring Data,Spring Data Jpa,注意:很多文件 既然我不能在保持文件可嵌入的同时用@id对其进行注释,那么我如何在文件中分配id?当前,文件表中的id为空 注 让它成为一个合适的实体@可嵌入对于值对象很有用,即通过值标识的对象。但是,由于您需要一个id,在您的场景中显然不是这样 你的理由 根据我们的要求,文件仅存在于注释上下文中 用于选择可嵌入文件的命令无效。虽然我在互联网上到处都能看到这样的短语,但你可以在任何上下文中使用@Embeddebles。作为@Embeddeble,与@Entity相比,您的文件实例不会更多或更少地
让它成为一个合适的实体@可嵌入对于值对象很有用,即通过值标识的对象。但是,由于您需要一个id,在您的场景中显然不是这样 你的理由
根据我们的要求,文件仅存在于注释上下文中
用于选择可嵌入文件的命令无效。虽然我在互联网上到处都能看到这样的短语,但你可以在任何上下文中使用@Embeddebles。作为@Embeddeble,与@Entity相比,您的文件实例不会更多或更少地绑定到Notes实例。当您需要不同的对象但需要单个实体时,请使用@Embeddeble。i、 将两个不同的类合并在一起构成一个数据库表。您可以在org.hibernate.annotations包中使用@CollectionId注释。由于您不能按照上面的答案将其作为一个实体,因此可以使用@CollectionId注释。此注释需要3个属性:列、生成器和集合对象中主键的类型。下面是一个帮助您的示例:-
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import javax.persistence.AttributeOverride;
import javax.persistence.AttributeOverrides;
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.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import org.hibernate.annotations.CollectionId;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Type;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
@Entity
@Table(name="USER_DETAILS")
public class UserDetails
{
private int userId;
private String userName;
private Date joinedDate;
private String description;
private Collection<Address> listOfAddresses=new ArrayList<Address>();
@Id@GeneratedValue(strategy=GenerationType.SEQUENCE)
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;
}
@Temporal(TemporalType.DATE)
public Date getJoinedDate()
{
return joinedDate;
}
public void setJoinedDate(Date joinedDate)
{
this.joinedDate = joinedDate;
}
@Lob
public String getDescription()
{
return description;
}
public void setDescription(String description)
{
this.description = description;
}
public String toString()
{
return "[ "+getUserId()+", "+getUserName()+", "+", "+getJoinedDate()+", "+getDescription()+" ]";
}
@ElementCollection
@JoinTable(name="User_Address", joinColumns=@JoinColumn(name="User_Id"))
@GenericGenerator(name="increment-gen",strategy="increment")
@CollectionId(columns= {@Column(name="ADDRESS_ID")}, generator="increment-gen", type=@Type(type="long"))
public Collection<Address> getListOfAddresses() {
return listOfAddresses;
}
public void setListOfAddresses(Collection<Address> listOfAddresses) {
this.listOfAddresses = listOfAddresses;
}
}
请参阅集合的getter,我已经添加了注释@CollectionId,还指定了@GenericGenerator,它来自同一个包,提供了在集合中生成主键的策略。我在@CollectionId中使用了相同的生成器。
希望这能有所帮助。你为什么希望它有一个id?当我需要获取/更新/删除一个特定的便笺文件时,分配一个怎么样。我也想过手动分配它,但这需要我确保分配和锁定访问的唯一ID。如果有更好的方法,那就好了。如果他们有Id,你想通过Id引用他们,为什么他们应该是可嵌入的?根据我们的要求,文件只存在于注释上下文中
@Embeddable
public class File {
private Long id;
private String name;
private String contentType;
private String uri;
}
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import javax.persistence.AttributeOverride;
import javax.persistence.AttributeOverrides;
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.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import org.hibernate.annotations.CollectionId;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Type;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
@Entity
@Table(name="USER_DETAILS")
public class UserDetails
{
private int userId;
private String userName;
private Date joinedDate;
private String description;
private Collection<Address> listOfAddresses=new ArrayList<Address>();
@Id@GeneratedValue(strategy=GenerationType.SEQUENCE)
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;
}
@Temporal(TemporalType.DATE)
public Date getJoinedDate()
{
return joinedDate;
}
public void setJoinedDate(Date joinedDate)
{
this.joinedDate = joinedDate;
}
@Lob
public String getDescription()
{
return description;
}
public void setDescription(String description)
{
this.description = description;
}
public String toString()
{
return "[ "+getUserId()+", "+getUserName()+", "+", "+getJoinedDate()+", "+getDescription()+" ]";
}
@ElementCollection
@JoinTable(name="User_Address", joinColumns=@JoinColumn(name="User_Id"))
@GenericGenerator(name="increment-gen",strategy="increment")
@CollectionId(columns= {@Column(name="ADDRESS_ID")}, generator="increment-gen", type=@Type(type="long"))
public Collection<Address> getListOfAddresses() {
return listOfAddresses;
}
public void setListOfAddresses(Collection<Address> listOfAddresses) {
this.listOfAddresses = listOfAddresses;
}
}