【问题标题】:Eclipse 'generate entities from tables' and 'many to one' relationEclipse“从表中生成实体”和“多对一”关系
【发布时间】:2017-03-19 08:06:55
【问题描述】:

我正在开发一个使用数据库的简单 Java EE 应用程序。它有两个以多对一关系连接的表(Admin 和 Session 签名)。

当我使用eclipse从表中生成实体时,我的links两个表的属性是这样生成的:

//bi-directional many-to-one association to Admin
@ManyToOne
@JoinColumn(name="owner")
private Admin admin;

问题是,我的owner 属性在数据库中是整数,并且它已被创建为管理员类型。

现在,当我想传递一些整数变量以将其输入到数据库时,我得到了错误:

The method setAdmin(Admin) in the type Signaturesession is not applicable for arguments (int).

或者当我想像这样将其转换为(管理员)时(从会话中获取):

(Admin)session.getAttribute("adminId")

我收到 Jboss 错误:

javax.servlet.ServletException: java.lang.ClassCastException: java.lang.Integer cannot be cast to com.podpisy.entities.Admin
javax.faces.webapp.FacesServlet.service(FacesServlet.java:606)
secure.SecurityCheckFilter.doFilter(SecurityCheckFilter.java:100)

我确信这可以很容易地完成,但我使用 Java 真的很糟糕。

感谢您的帮助。

编辑:

我的 Admin.java 类:

package com.podpisy.entities;

import java.io.Serializable;
import javax.persistence.*;
import java.util.List;


@Entity
@Table(name="admins")
@NamedQuery(name="Admin.findAll", query="SELECT a FROM Admin a")
public class Admin implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    private int id;

    private String login;

    private String password;

    //bi-directional many-to-one association to Signature
    @OneToMany(mappedBy="admin")
    private List<Signature> signatures;

    //bi-directional many-to-one association to Signaturesession
    @OneToMany(mappedBy="admin")
    private List<Signaturesession> signaturesessions;

    public Admin() {
    }

    public int getId() {
        return this.id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getLogin() {
        return this.login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public String getPassword() {
        return this.password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public List<Signature> getSignatures() {
        return this.signatures;
    }

    public void setSignatures(List<Signature> signatures) {
        this.signatures = signatures;
    }

    public Signature addSignature(Signature signature) {
        getSignatures().add(signature);
        signature.setAdmin(this);

        return signature;
    }

    public Signature removeSignature(Signature signature) {
        getSignatures().remove(signature);
        signature.setAdmin(null);

        return signature;
    }

    public List<Signaturesession> getSignaturesessions() {
        return this.signaturesessions;
    }

    public void setSignaturesessions(List<Signaturesession> signaturesessions) {
        this.signaturesessions = signaturesessions;
    }

    public Signaturesession addSignaturesession(Signaturesession signaturesession) {
        getSignaturesessions().add(signaturesession);
        signaturesession.setAdmin(this);

        return signaturesession;
    }

    public Signaturesession removeSignaturesession(Signaturesession signaturesession) {
        getSignaturesessions().remove(signaturesession);
        signaturesession.setAdmin(null);

        return signaturesession;
    }

}

我的 Signaturesession.class:

package com.podpisy.entities;

import java.io.Serializable;

import javax.persistence.*;


/**
 * The persistent class for the signaturesession database table.
 * 
 */
@Entity
@NamedQuery(name="Signaturesession.findAll", query="SELECT s FROM Signaturesession s")
public class Signaturesession implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    private int id;

    private String device;

    private String name;

    private int signatures;

    private int time;

    private String type;

    private int users;

    //bi-directional many-to-one association to Admin
    @ManyToOne
    @JoinColumn(name="owner")
    private Admin admin;

    public Signaturesession() {
    }

    public int getId() {
        return this.id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getDevice() {
        return this.device;
    }

    public void setDevice(String device) {
        this.device = device;
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getSignatures() {
        return this.signatures;
    }

    public void setSignatures(int signatures) {
        this.signatures = signatures;
    }

    public int getTime() {
        return this.time;
    }

    public void setTime(int time) {
        this.time = time;
    }

    public String getType() {
        return this.type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public int getUsers() {
        return this.users;
    }

    public void setUsers(int users) {
        this.users = users;
    }

    public Admin getAdmin() {
        return this.admin;
    }

    public void setAdmin(Admin admin) {
        this.admin = admin;
    }

}

【问题讨论】:

    标签: java mysql eclipse jakarta-ee


    【解决方案1】:

    你应该传递一个Admin 对象,它肯定有一个 int id 字段。

    所以你必须做这样的事情

      Admin myAdmin=new Admin(id,.. other properties);
      mySignaturesession.setAdmin(myAdmin); 
    

    编辑

    如果您想将 Admin 关联到您的 SignatureSession 对象,上述内容是有效的。相反,如果您在 Session 中有一个 Admin ojbect,您只需执行

           Admin anAdmin=(Admin)session.getAttibute("adminId");
           Admin myAdmin=new Admin(id,.. other properties);
    

    或 管理员 myAdmin=new Admin(); myAdmin.setId(anId);

    但是,我再说一遍,这取决于您在 Session 中拥有什么以及您处理哪些对象。 而且,当您希望使用 JPA 时,不要忘记对您的对象执行 em.persist 或 em.merge 之类的操作。 也许您应该更深入地了解 JPA 的工作原理。

    【讨论】:

    • 这样的?管理员 myAdmin = new Admin(); HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true); id2 = (Admin)session.getAttribute("adminId"); myAdmin.id = id2; ssession.setAdmin(myAdmin);
    • 该死,我不能把它放在 cmets 的不同行中。我得到'字段 Admin.id 不可见'。默认设置为私有。
    • 有些东西看起来很奇怪,请您发布 2 个类的定义,分别是 Admin 类和 Sessionsignature 类
    • 你的意思是从表格生成的类?
    • 有效!非常感谢! “myAdmin.setId(anId);”是我一直在寻找的。我不知道我必须先创建 Admin 对象,分配一个值,然后将其发送到 session.setAdmin(...);谢谢。
    猜你喜欢
    • 2017-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    相关资源
    最近更新 更多