一个注意:许多文件
如何在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;
}
答案 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。 希望这会有所帮助。