Java Spring Crudepository无法在复合主键中共享生成的id
我正在尝试使用SpringCrudepository,使用JPA数据库模型(User.java,UserInfo.java)将新对象插入数据库。数据库模型与复合主键(UserPK.java)相关,其中一个是自动生成的(字段名为id),第二个(字段名为type)是在开头设置的 当我使用crudepository(UserRepository.java)创建新对象时会出错-无法将新对象插入第二个模型(UserInfo.java),因为id为空(第一个模型已正确添加)。我认为问题在于在数据库模型中共享/映射复合主键。 我用EntityManager尝试了相同的模型,但没有错误——全部都添加了。接下来我使用了@PrimaryKeyJoinColumns注释,但结果与上面相同(但我不确定是否正确使用了它)——Crudepository失败,EntityManager成功 有人能帮我找到解决办法吗?如果有人想运行代码,我还会添加源代码 以下日志: 原木积层 日志实体管理器 下面的代码: 主模型:User.java 第二个模型:UserInfo.java 组合主键:UserPK.java springcrudepository:UserRepository.javaJava 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为空(第一个模型已正确添加)。我认为问题在于在数据库模型中共享
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);
}