Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring Crudepository无法在复合主键中共享生成的id_Java_Spring_Spring Data Jpa_Composite Primary Key_Spring Repositories - Fatal编程技术网

Java Spring Crudepository无法在复合主键中共享生成的id

Java Spring Crudepository无法在复合主键中共享生成的id,java,spring,spring-data-jpa,composite-primary-key,spring-repositories,Java,Spring,Spring Data Jpa,Composite Primary Key,Spring Repositories,我正在尝试使用SpringCrudepository,使用JPA数据库模型(User.java,UserInfo.java)将新对象插入数据库。数据库模型与复合主键(UserPK.java)相关,其中一个是自动生成的(字段名为id),第二个(字段名为type)是在开头设置的 当我使用crudepository(UserRepository.java)创建新对象时会出错-无法将新对象插入第二个模型(UserInfo.java),因为id为空(第一个模型已正确添加)。我认为问题在于在数据库模型中共享

我正在尝试使用SpringCrudepository,使用JPA数据库模型(User.javaUserInfo.java)将新对象插入数据库。数据库模型与复合主键(UserPK.java)相关,其中一个是自动生成的(字段名为id),第二个(字段名为type)是在开头设置的

当我使用crudepository(UserRepository.java)创建新对象时会出错-无法将新对象插入第二个模型(UserInfo.java),因为id为空(第一个模型已正确添加)。我认为问题在于在数据库模型中共享/映射复合主键。 我用EntityManager尝试了相同的模型,但没有错误——全部都添加了。接下来我使用了@PrimaryKeyJoinColumns注释,但结果与上面相同(但我不确定是否正确使用了它)——Crudepository失败,EntityManager成功

有人能帮我找到解决办法吗?如果有人想运行代码,我还会添加源代码

以下日志:

原木积层

日志实体管理器

下面的代码:

主模型:User.java

第二个模型:UserInfo.java

组合主键:UserPK.java

springcrudepository:UserRepository.java


User
UserPK
类需要稍加修改。主键的字段到列映射应该在
UserPK
类中。这里是变化

@Entity
@Table(name = "USER")
public class User implements Serializable {

    @OneToOne(cascade = CascadeType.ALL, mappedBy = "user")
    @JsonManagedReference
    private UserInfo info;

    @EmbeddedId
    private UserPK id;

    @Column(name = "LOGIN", nullable = false)
    private String login;

    @Column(name = "EMAIL", nullable = false)
    private String email;
    /* ... */

    @Embeddable
    @SequenceGenerator(name = "SEQ_ID",  initialValue=1, allocationSize=100)
    public static class UserPK implements Serializable {

        @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_ID")
        @Column(name = "ID", nullable = false)
        private Long id;

        @Column(name = "TYPE", nullable = false)
        private String type;
    }
}
对存储库的相应更改

@Repository
public interface UserRepository extends CrudRepository<User, User.UserPK> {
    User findByIdAndAndType(Long id, String type);
}
@存储库
公共接口UserRepository扩展了Crudepository{
用户findByIdAndAndType(长id,字符串类型);
}

感谢您的回复,我按照您的说法更改代码:UserPK.java,User.java+UserRepository.java。你可以在电视上看到变化。现在是另一个问题,无法生成密钥-即使我设置了密钥,也无法将其共享给UserInfo。Java对UserPK类wrt序列生成器进行了一些修改。现在试试。我更改了UserPK.java,但没有任何帮助。查看日志,hibernate没有为UserPK.java创建sequencer,因此自动生成的id不能与@Embeddeble注释一起使用,否则我们会出错。另一方面,我解决了共享/映射复合主键的问题——我刚刚在UserInfo.java中添加了@EmbeddedId注释。当然,你可以从中看到变化
import com.fasterxml.jackson.annotation.JsonManagedReference;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.io.Serializable;

@Entity
@Table(name = "USER")
@IdClass(UserPK.class)
public class User implements Serializable {

    @OneToOne(cascade = CascadeType.ALL, mappedBy = "user")
    @JsonManagedReference
    private UserInfo info;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_ID")
    @SequenceGenerator(name = "SEQ_ID", sequenceName = "SEQ_ID", allocationSize = 1)
    @NotNull
    @Column(name = "ID")
    private Long id;
    @Id
    @NotNull
    @Column(name = "TYPE")
    private String type;
    @NotNull
    @Column(name = "LOGIN")
    private String login;
    @NotNull
    @Column(name = "EMAIL")
    private String email;
    /* ... */
}
import com.fasterxml.jackson.annotation.JsonBackReference;
import javax.persistence.*;
import java.io.Serializable;

@Entity
@Table(name = "USER_INFO")
public class UserInfo implements Serializable {

    @Id
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumns({
     @JoinColumn(name = "id", referencedColumnName = "id"),
     @JoinColumn(name = "type", referencedColumnName = "type")
    })
    @JsonBackReference
    @MapsId
    private User user;

    @Column(name = "NAME")
    private String name;
    @Column(name = "SURNAME")
    private String surname;
    /* ... */
}
import java.io.Serializable;

public class UserPK implements Serializable {
    private Long id;
    private String type;
    /* ... */
}
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends CrudRepository<User, UserPK> {
    User findByIdAndAndType(Long id, String type);
}
import org.springframework.stereotype.Repository;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.transaction.Transactional;

@Repository
@Transactional
public class UserRepositoryEM {

    @PersistenceContext
    private EntityManager entityManager;

    public User findByKey(UserPK key) {
        return entityManager.find(User.class, key);
    }

    public User save(User user) {
        entityManager.persist(user);
        entityManager.flush();
        return user;
    }
}
@Entity
@Table(name = "USER")
public class User implements Serializable {

    @OneToOne(cascade = CascadeType.ALL, mappedBy = "user")
    @JsonManagedReference
    private UserInfo info;

    @EmbeddedId
    private UserPK id;

    @Column(name = "LOGIN", nullable = false)
    private String login;

    @Column(name = "EMAIL", nullable = false)
    private String email;
    /* ... */

    @Embeddable
    @SequenceGenerator(name = "SEQ_ID",  initialValue=1, allocationSize=100)
    public static class UserPK implements Serializable {

        @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_ID")
        @Column(name = "ID", nullable = false)
        private Long id;

        @Column(name = "TYPE", nullable = false)
        private String type;
    }
}
@Repository
public interface UserRepository extends CrudRepository<User, User.UserPK> {
    User findByIdAndAndType(Long id, String type);
}