JPA 2.0 - 嵌入式 Id,manytoone 不持久
JPA 2.0 - embedded Id, manytoone not persisted
我有 2 个实体(下面是简化版):
@Entity
Client
@Id protected String id;
@OneToMany(mappedBy = "sender", cascade = CascadeType.ALL)
protected List<Message> sentMessages = new ArrayList<>();
@Embeddable
MessagePK
@ManyToOne(/*cascade = CascadeType.ALL*/)
protected Client sender;
protected LocalDate dateTime;
@Entity
Message
@EmbeddedId protected MessagePK id;
@Column protected String message;
当我尝试保留消息时,它会抱怨客户端是一个临时实例。
所以,我尝试在那里放置一个级联操作,但这也没有用(现在已被注释掉)。
我好像想不通。
您不能在@Embeddable 中建立关系(如@ManyToOne)。
因为可嵌入对象没有自己的标识(缺少主键),所以它只需要被视为封装它的实体的一部分。从数据库的角度来看,嵌入式对象与其余实体属性一起存储在一行中。
您可以使用@IdClass 注释来创建复合键sender/datetime
见:https://wiki.eclipse.org/EclipseLink/Examples/JPA/2.0/DerivedIdentifiers
我有 2 个实体(下面是简化版):
@Entity
Client
@Id protected String id;
@OneToMany(mappedBy = "sender", cascade = CascadeType.ALL)
protected List<Message> sentMessages = new ArrayList<>();
@Embeddable
MessagePK
@ManyToOne(/*cascade = CascadeType.ALL*/)
protected Client sender;
protected LocalDate dateTime;
@Entity
Message
@EmbeddedId protected MessagePK id;
@Column protected String message;
当我尝试保留消息时,它会抱怨客户端是一个临时实例。
所以,我尝试在那里放置一个级联操作,但这也没有用(现在已被注释掉)。
我好像想不通。
您不能在@Embeddable 中建立关系(如@ManyToOne)。 因为可嵌入对象没有自己的标识(缺少主键),所以它只需要被视为封装它的实体的一部分。从数据库的角度来看,嵌入式对象与其余实体属性一起存储在一行中。
您可以使用@IdClass 注释来创建复合键sender/datetime 见:https://wiki.eclipse.org/EclipseLink/Examples/JPA/2.0/DerivedIdentifiers