我将分离的实体传递给persist:model。公司当我使用@OneToMany映射时。我尝试了不同的方法,但结果相同。 我添加了@OneToMany和CascadeTypes Persist等等。删除那些。 设置经理,并试图坚持,评论经理集,并试图坚持。他们都没有工作。
公司
org.springframework.data.cassandra.repository.CassandraRepository
管理器
@Entity
public class Company {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private int id;
private int age;
@ElementCollection
private Set<Manager> managers;
private String name;
public int getId() {
return this.id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public void setManagers(Set<Manager> managers) {
this.managers = managers;
}
public Set<Manager> getManager() {
return managers;
}
}
测试
@Entity
public class Manager {
@Id
@GeneratedValue
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
答案 0 :(得分:2)
您正在使用company.setId(1);
手动设置公司ID。
@GeneratedValue
最好不要管它。
持久化上下文将假设记录已存在,但已分离,因为已设置id但实体不在当前持久性上下文中(由当前EntityManager表示)。
答案 1 :(得分:0)
首先,可以使用带有@MappedSuperClass
注释的抽象基类来实现通用方面,例如主键管理:
Proxy
注意:@MappedSuperClass
public abstract class AbstractEntity {
@Id
@Column(name = "id")
//@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "pk-sequence")
//@SequenceGenerator(name = "pk-sequence", sequenceName = "ID_GEN", allocationSize = 1)
protected Long objectID = -1;
@Version
private int version;
public int getVersion() {
return version;
}
public long getObjectID() {
return objectID;
}
}
和objectID
属性都没有设置器。因此,在运行时,ORM 仅 将继续控制。这样,version
的实例可以安全地管理lifecycle of an Entity
。有关@Version
的详细信息,请参阅另一个答案。此外,可以增强这种通用方法以包括其他通用方面,例如,创建/修改日期/时间戳。
这将大大简化您现有的EntityManager
课程。
@Entity
另请注意,我注释了@Entity
public class Company extends AbstractEntity {
private static final long serialVersionUID = 1L;
private int age;
// @ElementCollection <-- Use a 1-n annotation here instead.
@OneToMany(cascade=CascadeType.ALL)
// to ensure non persisted manager objects will be persisted via a cascade chain here...
private Set<Manager> managers;
private String name;
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public void setManagers(Set<Manager> managers) {
this.managers = managers;
}
public Set<Manager> getManager() {
return managers;
}
}
,但更改了映射以使用@ElementCollection
注释。这背后的基本原理是@OneToMany
只能用于指定a one-to-many relationship to an Embeddable
object, or basic types(例如,通过Set&lt; Integer&gt;等引用),而实体类{{1}不是这种情况。 }}。
最后,
ElementCollection
通过上述更改,您应该能够运行Manager
方法中提供的代码。请注意,在保留之前,您仍应检查正确的关联顺序。我没有测试您问题中提供的提供的代码段;尽管如此,你应该能够使它发挥作用。
希望它有所帮助。