如何为可嵌入类生成id?

时间:2017-07-21 04:37:36

标签: hibernate spring-data spring-data-jpa

一个注意:许多文件

如何在File中分配一个id,因为我不能用@Id对它进行注释,同时保持它可嵌入?目前,File表中的id为null。

注意

@Entity
public class Note {
    @Id
    @GeneratedValue
    @JsonProperty(value = "noteID", access = Access.READ_ONLY)
    private Long id;

    @ElementCollection
    @CollectionTable(
          name = "FILE",
          joinColumns = @JoinColumn(name = "NOTE_ID")
    )
    List<File> files;

}

文件

@Embeddable
public class File {
    private Long id;

    private String name;

    private String contentType;

    private String uri;
}

3 个答案:

答案 0 :(得分:1)

让它成为一个合适的实体。 @Embeddable对值对象很有用,即由它们的值标识的对象。但是,由于您需要id,因此在您的方案中显然不是这种情况。

你的理由

  

根据我们的要求,文件仅存在于注释上下文

选择嵌入的

无效。虽然我在互联网上看到了类似这样的短语,但您可以在所需的上下文中使用@Embeddable s。由于@Embeddable您的File个实例与Note个实例的约束与@Entity实例的约束不同。

答案 1 :(得分:0)

仅在需要不同对象但使用单个实体时才使用@Embeddable。即两个不同的类一起构成一个数据库表。

答案 2 :(得分:0)

您可以在org.hibernate.annotations包中使用@CollectionId注释。由于无法按照上面的答案将其设置为实体,因此可以使用@CollectionId批注。该批注需要3个属性:列,生成器和Collection对象中主键的类型。下面是一个可以帮助您的示例:-

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;
   }
 }

请参阅集合的获取器,我已经在注释中添加了@CollectionId,还指定了@GenericGenerator,它来自同一包,并提供了在集合中生成主键的策略。我在@CollectionId中使用了相同的Generator。 希望这会有所帮助。