Hibernate 如何为可嵌入类生成id?

Hibernate 如何为可嵌入类生成id?,hibernate,spring-data,spring-data-jpa,Hibernate,Spring Data,Spring Data Jpa,注意:很多文件 既然我不能在保持文件可嵌入的同时用@id对其进行注释,那么我如何在文件中分配id?当前,文件表中的id为空 注 让它成为一个合适的实体@可嵌入对于值对象很有用,即通过值标识的对象。但是,由于您需要一个id,在您的场景中显然不是这样 你的理由 根据我们的要求,文件仅存在于注释上下文中 用于选择可嵌入文件的命令无效。虽然我在互联网上到处都能看到这样的短语,但你可以在任何上下文中使用@Embeddebles。作为@Embeddeble,与@Entity相比,您的文件实例不会更多或更少地

注意:很多文件

既然我不能在保持文件可嵌入的同时用@id对其进行注释,那么我如何在文件中分配id?当前,文件表中的id为空


让它成为一个合适的实体@可嵌入对于值对象很有用,即通过值标识的对象。但是,由于您需要一个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;
   }
 }