java创建一个类的实例,同时创建依赖于第一个类的另一个类的实例
编辑:这个问题与链接的问题有何不同
我认为这个问题是不同的,因为它似乎是由JPA试图添加另一个具有相同id的用户引起的,因为类(学生)中添加了foregin键值。相关问题似乎是由于没有自动生成ID造成的
我有一个创建用户并返回用户的方法。我将此用户传递给另一个方法以创建学生。用户是一名学生。但我不能这样做,因为我得到:
组织。postgresql。util。PSQLException:错误:重复的键值违反唯一约束“pk\u user\u id”
详细信息:密钥(用户id)=(7001)已存在
我在支持bean中的方法如下所示:
public Users2 addUser(String username, String password, String emailadress,
String firstname, String lastname) {
Users2 u = new Users2();
u.setUsername(username);
u.setPassword(password);
u.setEmailaddress(emailadress);
u.setFirstname(firstname);
u.setLastname(lastname);
System.out.println(em + ": Adding course " + u);
em.persist(u);
em.flush();
System.out.println(u.getUser_id());
return u;
}
public void addStudent(Users2 u2) {
Student s = new Student();
s.setUser_id(u2.getUser_id());
s.setUsername(u2.getUsername());
s.setLastname(u2.getLastname());
s.setFirstname(u2.getFirstname());
s.setPassword(u2.getPassword());
s.setEmailaddress((u2.getEmailaddress()));
em.persist(s);
}
我在Jsf bean中的方法如下所示:
@Inject
DbStore store;
public String CreateUser(){
long usrid;
String username = this.username;
String password = this.password;
String emailadress = this.emailaddress;
String firstname = this.firstname;
String lastname = this.lastname;
Users2 u1 = store.addUser(username, password, emailadress, firstname, lastname);
//System.out.println(usrid);
String role = this.role;
if(this.role.equals("Student"))
store.addStudent(u1);
return "admin_listcourses.xhtml";
}
我的实体:
import javax.persistence.Id;
import javax.validation.constraints.Max;
import java.util.List;
import java.util.Set;
@Entity
@Table(name = "student")
@SecondaryTable(name = "users2", pkJoinColumns=@PrimaryKeyJoinColumn(name="user_id", referencedColumnName="user_id"))
public class Student {
/**
* Created by Elev1 on 2016-08-25.
*
*/
@Id
@SequenceGenerator(name="student_student_id_seq",
sequenceName="student_student_id_seq",
allocationSize=1)
@GeneratedValue(strategy = GenerationType.SEQUENCE,
generator="seq")
@Column(name = "student_id", updatable=false)
private long student_id;
@Column(table="users2", name="username")
private String username;
@Column(table="users2", name="firstname")
private String firstname;
@Column(table="users2", name="lastname")
private String lastname;
@Column(table="users2", name="password")
private String password;
@Column(table="users2", name="emailaddress")
private String emailaddress;
@Column(table="users2", name="user_id")
private long user_id;
@ManyToMany
@JoinTable(name="student_course",
joinColumns=
@JoinColumn(name="student_id", referencedColumnName="student_id"),
inverseJoinColumns=
@JoinColumn(name="course_id", referencedColumnName="course_id")
)
// public List<Course> getCourses() { return courses ; }
public List<Course> courses;
//Getters and setters
public long getStudent_id() {
return student_id;
}
public void setStudent_id(long student_id) {
this.student_id = student_id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getFirstname() {
return firstname;
}
public void setFirstname(String firstname) {
this.firstname = firstname;
}
public String getLastname() {
return lastname;
}
public void setLastname(String lastname) {
this.lastname = lastname;
}
public List<Course> getCourses() {
return courses;
}
public void setCourses(List<Course> courses) {
this.courses = courses;
}
public long getUser_id() {
return user_id;
}
public void setUser_id(long user_id) {
this.user_id = user_id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmailaddress() {
return emailaddress;
}
public void setEmailaddress(String emailaddress) {
this.emailaddress = emailaddress;
}
}
package se.lexicon.entities;
import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;
@Entity
public class Users2{
// ***********************
// ** Attributes **
// ***********************
@Id
@SequenceGenerator(name="users_user_id_seq",
sequenceName="users_user_id_seq",
allocationSize=1)
@GeneratedValue(strategy = GenerationType.SEQUENCE,
generator="seq")
private Long user_id;
@Column(name = "username", length = 64)
private String username;
private String password;
@Column(name = "emailaddress", length = 64)
private String emailaddress;
@Column(name = "firstname")
private String firstname;
@Column(name = "lastname")
private String lastname;
@Temporal(TemporalType.TIMESTAMP)
private Date last_login;
// ************************
// ** Constructors **
// ************************
// public User() {
// public User(Long user_id) {
// this.user_id = user_id;
// }
// public User(Long user_id, String username, String password, String emailaddress, ??? last_login) {
// this.user_id = user_id;
// this.username = username;
// this.password = password;
// this.emailaddress = emailaddress;
// this.last_login = last_login;
//}
// ******************************
// ** Getters & Setters **
// ******************************
public long getUser_id() {
return user_id;
}
public void setUser_id(long user_id) {
this.user_id = user_id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmailaddress() {
return emailaddress;
}
public void setEmailaddress(String emailaddress) {
this.emailaddress = emailaddress;
}
public Date getLast_login() {
return last_login;
}
public void setLast_login(Date last_login) {
this.last_login = last_login;
}
public String getFirstname() {
return firstname;
}
public void setFirstname(String firstname) {
this.firstname = firstname;
}
public String getLastname() {
return lastname;
}
public void setLastname(String lastname) {
this.lastname = lastname;
}
//}
}
编辑:我的解决方案。我删除了student表中的foregin_键约束。我只在学生课堂上保留了学生id、课程id和用户id。我删除了Student类中Student和Users2之间的所有连接,如果给定了Student_id,我将使用方法从Users2类中获取这些连接。创建用户(即学生)时,将添加一个学生,并将该用户的用户id设置为该学生的用户id
现在这不是一个很好的解决方案,所以如果有人能解决我原来的问题,我很乐意接受这个解决方案。但现在,我的解决方案将不得不这样做
# 1 楼答案
当您持久化一个学生实例时,JPA还将在
Users2
表中创建一行,user_id
作为Student
表中行的外键。但是Users2
中已经有一行具有非常相同的ID,正如您刚才持久化了一个Users2
实例一样。这就是您面临此SQLException的原因对我来说,在这里使用二次表方法没有多大意义,因为可能有我的用户根本不是学生,对吗?但是在您当前的模型中,Users表将外键存储到Student表中
在本例中,似乎更适合在这里使用继承(或某些组合),即二次表方法的instaead。 学生是一个用户,所以学生可以从用户继承。 您将在这里找到如何在本例中定义映射的第一个概述:
https://en.wikibooks.org/wiki/Java_Persistence/Inheritance