0

EJB、JPA、および netbeans を使用して Java Web EE アプリケーションを開発しています。登録とログイン用のsql という名前のユーザーを持つテーブルと、ユーザーの主キー idusers (docid、pharmid、patid) を参照する 3 つの外部キーを持つprescriptsという名前の別のテーブルを作成しました。また、users という名前の Net Bean エンティティ Bean と UsersFacade という名前のセッション Bean を作成し、処方箋用にエンティティ Bean: prescripts とセッション Bean: PrescriptsFacade を作成しました。

私の質問はこれです:

ユーザー ejb では、すべての変数 (列) がそのまま (文字列の場合は文字列、整数の場合は整数など) 宣言され、prescripts ではユーザーとして宣言されるのはなぜですか?

//users.java
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "idusers")
private Integer idusers;
@Column(name = "user_type")
private String userType;
@Column(name = "name")
private String name;
@Column(name = "nickname")
private String nickname;

//prescripts.java
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "idprescripts")
private Integer idprescripts;
@Column(name = "data")
private String data;
@JoinColumn(name = "pharm_id", referencedColumnName = "idusers")
@ManyToOne
private Users users;
@JoinColumn(name = "doc_id", referencedColumnName = "idusers")
@ManyToOne
private Users users1;
@JoinColumn(name = "pat_id", referencedColumnName = "idusers")
@ManyToOne
private Users users2;

ユーザーの場合、サーブレットでこのコードを使用して、SQL ベースに行を挿入します。

Users currentUsers;
currentUsers = new Users();
String Type = request.getParameter("user_type");
String Name = request.getParameter("name");
String Nickname = request.getParameter("nickname");
currentUsers.setUserType(Type);
currentUsers.setName(Name);
currentUsers.setNickname(Nickname);
UsersFacade.create(currentUsers);

このように処方箋に行を挿入するにはどうすればよいですか?

これは機能しません (エラー null ポインター例外が表示されます):

currentPresc = new Prescripts();
String PatID = request.getParameter("pat_id");
String DocID = request.getParameter("doc_id");
String PharmID = request.getParameter("pharm_id");
String Data = request.getParameter("data");
int patid = Integer.parseInt(PatID);
int docid = Integer.parseInt(DocID);
int pharmid = Integer.parseInt(PharmID);
currentUsers = UsersFacade.find(patid);
currentPresc.setUsers(currentUsers);
currentUsers = UsersFacade.find(docid);
currentPresc.setUsers1(currentUsers);
currentUsers = UsersFacade.find(pharmid);
currentPresc.setUsers2(currentUsers);
currentPresc.setData(Data);
PrescriptsFacade.create(currentPresc);

簡単にするために、set メソッドと get メソッド、およびいくつかの変数をスキップしました。どんな助けでも本当に感謝しています、私は今この2週間で立ち往生しています:'(


ユーザーと処方箋の全クラスをお送りします。

Prescripts.java

package entities;

import java.io.Serializable;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;


@Entity
@Table(name = "prescripts")
@NamedQueries({
    @NamedQuery(name = "Prescripts.findAll", query = "SELECT p FROM Prescripts p"),
    @NamedQuery(name = "Prescripts.findByIdprescripts", query = "SELECT p FROM Prescripts p WHERE p.idprescripts = :idprescripts"),
    @NamedQuery(name = "Prescripts.findByData", query = "SELECT p FROM Prescripts p WHERE p.presc = :presc")})
public class Prescripts implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "idprescripts")
    private Integer idprescripts;

    @JoinColumn(name = "doc_id", referencedColumnName = "idusers")
    @ManyToOne
    private Users doc_id;

    @JoinColumn(name = "pat_id", referencedColumnName = "idusers")
    @ManyToOne
    private Users pat_id;

    @JoinColumn(name = "pharm_id", referencedColumnName = "idusers")
    @ManyToOne
    private Users pharm_id;
    @Column(name = "presc")
    private String presc;

    public Prescripts() {
    }

    public Prescripts(Users pat_id, Users pharm_id, Users doc_id, String presc) {

        this.pharm_id = pharm_id;
        this.doc_id = doc_id;
        this.pat_id = pat_id;
        this.presc = presc;


    }

    public Integer getIdprescripts() {
        return idprescripts;
    }

    public void setIdprescripts(Integer idprescripts) {
        this.idprescripts = idprescripts;
    }

    public String getPresc() {
        return presc;
    }

    public void setPresc(String presc) {
        this.presc = presc;
    }


    public Users getPharmId() {
        return pharm_id;
    }

    public void setPharmId(Users pharm_id) {
        this.pharm_id = pharm_id;
    }


    public Users getDocId() {
        return doc_id;
    }

    public void setDocId(Users doc_id) {
        this.doc_id = doc_id;
    }

    public Users getPatId() {
        return pat_id;
    }

    public void setPatId(Users pat_id) {
        this.pat_id = pat_id;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (idprescripts != null ? idprescripts.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Prescripts)) {
            return false;
        }
        Prescripts other = (Prescripts) object;
        if ((this.idprescripts == null && other.idprescripts != null) || (this.idprescripts != null && !this.idprescripts.equals(other.idprescripts))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "entities.Prescripts[idprescripts=" + idprescripts + "]";
    }

}

ユーザー.java

package entities;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import javax.persistence.*;
import javax.xml.bind.annotation.XmlTransient;


@Entity
@Table(name = "users")
@NamedQueries({
    @NamedQuery(name = "Users.findAll", query = "SELECT u FROM Users u"),
    @NamedQuery(name = "Users.findByIdusers", query = "SELECT u FROM Users u WHERE u.idusers = :idusers"),
    @NamedQuery(name = "Users.findByUserType", query = "SELECT u FROM Users u WHERE u.userType = :userType"),
    @NamedQuery(name = "Users.findByNickname", query = "SELECT u FROM Users u WHERE u.nickname = :nickname"),
    @NamedQuery(name = "Users.findByName", query = "SELECT u FROM Users u WHERE u.name = :name"),
    @NamedQuery(name = "Users.findByPassword", query = "SELECT u FROM Users u WHERE u.password = :password"),
    @NamedQuery(name = "Users.findByEmail", query = "SELECT u FROM Users u WHERE u.email = :email"),
    @NamedQuery(name = "Users.findByCity", query = "SELECT u FROM Users u WHERE u.city = :city"),
    @NamedQuery(name = "Users.findByStreet", query = "SELECT u FROM Users u WHERE u.street = :street"),
    @NamedQuery(name = "Users.findByAt", query = "SELECT u FROM Users u WHERE u.at = :at"),
    @NamedQuery(name = "Users.findByAmka", query = "SELECT u FROM Users u WHERE u.amka = :amka"),
    @NamedQuery(name = "Users.findByAfm", query = "SELECT u FROM Users u WHERE u.afm = :afm"),
    @NamedQuery(name = "Users.findByVerify", query = "SELECT u FROM Users u WHERE u.verify = :verify")})
public class Users implements Serializable {
    @OneToMany(mappedBy = "pat_id")
    private List<Prescripts> prescriptsList;
    @OneToMany(mappedBy = "doc_id")
    private List<Prescripts> prescriptsList1;
    @OneToMany(mappedBy = "pharm_id")
    private List<Prescripts> prescriptsList2;



    private static final long serialVersionUID = 1L;
    @Id

    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "idusers")
    private Integer idusers;

    @Column(name = "user_type")
    private String userType;
    @Column(name = "name")
    private String name;
    @Column(name = "nickname")
    private String nickname;
    @Column(name = "password")
    private String password;
    @Column(name = "email")
    private String email;
    @Column(name = "city")
    private String city;
    @Column(name = "street")
    private String street;
    @Column(name = "AT")
    private String at;
    @Column(name = "AMKA")
    private String amka;
    @Column(name = "AFM")
    private String afm;
    @Column(name = "verify")
    private Boolean verify;

    public Users() {
    }

        public Users( String userType,String name,String nickname, String password, String email, String city, String street, String at,
            String amka, String afm, Boolean verify)
    {   
        this.userType= userType;
        this.name= name;
        this.nickname= nickname;
        this.password= password;
        this.email = email;
        this.city = city;
        this.street = street;
        this.at = at;
        this.amka = amka;
        this.afm = afm;
        this.verify=verify;

    }

    public Integer getIdusers() {
        return idusers;
    }

    public void setIdusers(Integer idusers) {
        this.idusers = idusers;
    }

    public String getUserType() {
        return userType;
    }

    public void setUserType(String userType) {
        this.userType = userType;
    }

    public String getName() {
        return name;
    }

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

    public String getNickname() {
        return nickname;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }

    public String getPassword() {
        return password;
    }

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

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }

    public String getAt() {
        return at;
    }

    public void setAt(String at) {
        this.at = at;
    }

    public String getAmka() {
        return amka;
    }

    public void setAmka(String amka) {
        this.amka = amka;
    }

    public String getAfm() {
        return afm;
    }

    public void setAfm(String afm) {
        this.afm = afm;
    }

    public Boolean getVerify() {
        return verify;
    }

    public void setVerify(Boolean verify) {
        this.verify = verify;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (idusers != null ? idusers.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Users)) {
            return false;
        }
        Users other = (Users) object;
        if ((this.idusers == null && other.idusers != null) || (this.idusers != null && !this.idusers.equals(other.idusers))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "entities.Users[idusers=" + idusers + "]";
    }



    public List<Prescripts> getPrescriptsList() {
        return prescriptsList;
    }

    public void setPrescriptsList(List<Prescripts> prescriptsList) {
        this.prescriptsList = prescriptsList;
    }

    public List<Prescripts> getPrescriptsList1() {
        return prescriptsList1;
    }

    public void setPrescriptsList1(List<Prescripts> prescriptsList1) {
        this.prescriptsList1 = prescriptsList1;
    }

    public List<Prescripts> getPrescriptsList2() {
        return prescriptsList2;
    }

    public void setPrescriptsList2(List<Prescripts> prescriptsList2) {
        this.prescriptsList2 = prescriptsList2;
    }





}
4

2 に答える 2

1

主な問題は、User クラスの変数が Integer として宣言されているのに、Prescript の「user_id-variable」が User として宣言されている理由のようです。

これは単に EJB3 が機能する方法です。あなたは、SQL とリレーショナル データベースに関して多くのことを考えています。テーブルの主キー (Users.idusers など) を列のように定義しますが、他のオブジェクト (正確にはエンティティ) への参照は自然オブジェクトを使用して定義されます。したがって、Prescripts.users は Users オブジェクトとして宣言されます。EJB プラットフォームは、これを正しい型 (この場合は Integer) でデータベース列 (この場合はおそらく users_idusers という名前) に変換しますが、これは処理されるので、気にする必要はありません。

EJB3 チュートリアルを 1 つまたは 2 つ実行する必要があります。これらはたくさんあります。チュートリアルを完了するようにしてください。あなたはいくつかの基本を見逃しているようでした。また、コードがはるかに単純になる可能性があることにも注意してください。「@Column」アノテーションは通常必要ありません。mapped_by は通常必要ありません。列名も同様です。また、単数形の名前を使用します (Users ではなく User)。主キーの一般的な標準は単純@Id Long idで、すべてのエンティティの主キーの名前を覚えやすくします (ただし、個別の名前を好む人もいます)。

実際の問題に答えるには、TestServlet.java の 233 行目にあるものなど、より多くの情報が必要です。コードは多かれ少なかれ正しいようですが、他の人がそれを確認するのは困難です。EntityManger/facade からユーザー オブジェクトを見つけて、それを Prescipts オブジェクトに設定するのが正しい方法です。

于 2012-05-20T20:12:07.840 に答える
0

Java では、エンティティ間の関係 (エンティティ関係モデル) は、オブジェクトへの参照 (1 対 1) またはオブジェクトへの参照のリスト (1 対多) として表されます。

リレーショナル データベースは、エンティティ (テーブル内の行) 間の関係を外部キーとして実装します。これは、別のテーブル内の行の主キーと一致します。

(「リレーショナル データベース」の「リレーショナル」という言葉は、実際には、テーブル内の列 (タプル) が互いに関連していることを意味するだけです... 外部キーのものは追加です。)

私は一般的に、データベーステーブルをすべて意地悪に設計する前に、適切なエンティティリレーションショップモデルから始めるのが賢明だと考えました...

于 2012-05-20T20:43:32.723 に答える