传递给persist的分离实体:model.Company

时间:2018-04-12 06:43:29

标签: java jpa orm jpa-2.0

我将分离的实体传递给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;
    }
}

2 个答案:

答案 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方法中提供的代码。请注意,在保留之前,您仍应检查正确的关联顺序。我没有测试您问题中提供的提供的代码段;尽管如此,你应该能够使它发挥作用。

希望它有所帮助。