2

JPA 2.0 でマッピングされた複数のエンティティを選択する必要があり、Hibernate を使用しています。

ユーザーのログインを検証しています。抽象クラス(Person)を拡張するクラスClienteDTO(クライアント) があります。Pessoa

@Entity
@Table(name = "cliente")
@PrimaryKeyJoinColumn(name = "id") 
public class ClienteDTO extends Pessoa implements Serializable {

private static final long serialVersionUID = 9057647385901589752L;

@OneToOne(mappedBy="cliente", cascade=CascadeType.ALL)
private LoginDTO login;

public ClienteDTO() {

}

    //get set
}

これが私のクラスですPessoa(ポルトガル語で「人」)

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@SequenceGenerator(name = "PESSOA_SEQ", sequenceName = "s_pessoa", initialValue = 1000, allocationSize = 20)
public abstract class Pessoa implements Serializable {

private static final long serialVersionUID = 5777501399478522675L;

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "PESSOA_SEQ")
@Column(unique = true, nullable = false, updatable = false)
private Long id;

private String nome;

private String email;

private String cpf;

public Pessoa() {

}

//get set

}

そしてこれがLoginクラスです。

@Entity
@Table(name = "login")
@NamedQueries({

    @NamedQuery(name = "obterUsuarioPorUsuarioSenha", query = "select l from LoginDTO where l.usuario = :usuarioParam and l.senha = :senhaParam"),

})
public class LoginDTO implements Serializable {

private static final long serialVersionUID = 1718733412549158088L;

@Id
@Column(nullable = false)
@GeneratedValue(generator = "gen")
@GenericGenerator(name = "gen", strategy = "foreign", parameters = @Parameter(name = "property", value = "cliente"))
private Long idLoginCliente;

@OneToOne(fetch=FetchType.LAZY)
@PrimaryKeyJoinColumn
private ClienteDTO cliente;

@Column(unique = true, nullable = false)
private String usuario;

@Column(nullable = true)
private String senha;

public LoginDTO() {

}

// get set

}

私のデータベースは次のように生成されました:

テーブル ClienteDTO (クライアント) id = 1000

テーブルペソア(人)

id = 1000
nome = ABC
email = xpto@xpto.xpto
cpf = 2131313124124

テーブル ログイン

idlogincliente = 1000
usuario (user) = admin
senha (password) = 8c48747q4s9c4q65

@NamedQueryatLoginのエンティティを使用しています。次のメソッドを使用して EJB を呼び出しています。

public LoginDTO efetuarLogin(LoginDTO usuarioDTO) throws Exception {

    Query q = em.createNamedQuery("obterUsuarioPorUsuarioSenha");
    q.setParameter("usuarioParam", usuarioDTO.getUsuario());
    q.setParameter("senhaParam", usuarioDTO.getSenha());

    try {
        return (LoginDTO) q.getSingleResult();
    } catch (NoResultException ne) {
        throw new NoResultException(ne.getMessage());
    }

}

問題は、クエリを作成できないことです。この場合、エラーが発生しています

原因: javax.persistence.NoResultException: クエリのエンティティが見つかりません

それはFETCHのせいですか?それともエンティティの関係が間違っていますか? 間違ったクエリですか?

=====================================

答え:

私はただのばかです。ご覧のとおり、パスワードを暗号化していました。また、マネージド Bean では、フォームからパスワードを暗号化していませんでした。とにかく、このスレッドは何らかの形で人々を助けるかもしれません. みんなありがとう。

4

0 に答える 0