当前位置: 首页 > 知识库问答 >
问题:

创建一个类的实例,同时创建依赖于第一个类的另一个类的实例[重复]

齐英韶
2023-03-14

我认为这个问题是不同的,因为它似乎是由JPA试图添加另一个具有相同id的用户引起的,因为在被添加的类(学生)中有一个forregin键值。链接的问题似乎是由没有自动生成ID引起的。

我有一个方法,它创建一个用户并返回一个用户。我将此用户传递给另一个方法来创建学生。用户是一名学生。但是我不能这样做,因为我得到:
org.PostgreSQL.util.psqlException:erro:duplicate key value违反了唯一约束“pk_user_id”detail:key(user_id)=(7001)已经存在。

我在backing 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);
}
@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_key约束。我在Student类中只保留student_id、course_id和user_id。我删除了Student类中Student和Users2之间的所有连接,相反,如果给定了student_id,我使用方法从Users2类获取这些连接。当创建用户(即学生)时,将添加一个学生,并将用户的user_id设置为学生的user_id。

现在这不是一个很好的解决方案,所以如果有人能解决我原来的问题,我会很乐意接受这个解决方案。但现在我的解决方案必须解决。

共有1个答案

孔彭祖
2023-03-14

持久化学生实例时,JPA还将在users2表中创建一行,并将user_id作为Student表中该行的外键。但是在users2中已经有一行具有完全相同的ID,就像您之前保存的users2实例一样。这就是您面临此SQLException的原因。

对我来说,在这里使用secondarytable方法没有多大意义,因为我的用户可能根本不是学生,对吗?但是在当前的模型中,Users表存储了Student表的外键。

在这个例子中,这里似乎更合适的是使用继承(或者可能是某种组合),即secondarytable方法的instaead。学生是一个用户,所以学生可以从用户继承。您将在这里找到如何定义这种情况下的映射的第一个概述:
https://en.wikibooks.org/wiki/java_persistence/继承

 类似资料:
  • 本文向大家介绍创建一个类Person的简单实例,包括了创建一个类Person的简单实例的使用技巧和注意事项,需要的朋友参考一下 创建一个类Person,包含以下属性:姓名(name)、年龄(age)、朋友(friends数组)、问候(sayhi方法,输出问候语,例如:“你好!”)、交朋友(addFriend方法,向friends里添加一个值),然后创建两个此类的实例:“小张“,22,[“小李”,”

  • 对不起,如果这是一个微不足道的问题,我是新的指南。假设我有下面这个类: 然后在其他地方我想做: 我希望有两个“MyClass”实例,一个名为“foo ”,一个名为“bar ”(也就是说,它们中的每一个都有一个不同的依赖实例)。我如何将这两个实例添加到我的注入器中,如何用“injector.getInstance”检索它们中的每一个? 我不想为每个可能的依赖项创建一个“MyClass”的子类。 谢谢

  • 我目前正在与tkinter一起完成一项学校作业,为用户创建一个图形用户界面以输入他们的输入。我决定将输入分成不同的页面,以避免用户被问题淹没,并且不需要滚动 每一页都有一系列标签和条目,在一个右除数和一个左除数上分开,我已经设法在每一页上实现了这一点,付出了一些努力。这是我工作代码的简化版本: 然而,在将每个页面拆分为两个不同的Frame()容器时,我遇到了两个问题: 用ipadx和ipady设置

  • 我已经完成了一些Java教程,它们都说在调用类时创建一个新变量。这是为什么?我已经测试了一些代码,但它没有这样做。我已经使用python很长一段时间了,所以我习惯于使用动态语言。 请看下面我一直在玩的一些代码: 谢谢你的时间。

  • 问题内容: 我有一个自动相互连接的Spring bean图。大大简化了图示: 所有这些bean都没有指定范围,这暗示它们是单例(使它们成为显式单例不会改变任何东西,我已经尝试过)。 问题在于,在实例化 单个应用程序上下文之后 ,的实例和包含的 不同 实例。怎么会这样 我试图为它创建public no args构造函数,并且调试已确认创建了多次。所有这些创建的堆栈跟踪都在这里。 我还尝试过为Spri

  • 我有一张相互自动连线的Spring豆图。高度简化的插图: 所有这些bean都没有指定作用域,这意味着它们是单例(我已经尝试过了,让它们显式单例不会改变任何东西)。 问题是,在实例化单个应用程序上下文之后,Bar和Baz的实例包含不同的Foo实例。这怎么会发生? 我尝试为创建公共no args构造函数,并且调试已确认已多次创建。所有这些创建的堆栈跟踪都在这里。 我还尝试为Spring启用调试日志记录

  • 显示天气预报的列表我们使用RecyclerView,所以你需要在build.gradle中增加一个新的依赖: dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile "com.android.support:appcompat-v7:$support_version" compile

  • org.hibernate.Criteria接口表示特定持久类的一个查询。Session 是 Criteria 实例的工厂。 Criteria crit = sess.createCriteria(Cat.class); crit.setMaxResults(50); List cats = crit.list();