Java 8 命令行nashorn脚本(jjs)无法创建实体管理器。为什么?
命令行nashorn脚本(jjs)无法创建实体管理器。Java 8 命令行nashorn脚本(jjs)无法创建实体管理器。为什么?,java-8,java-ee-7,jpa-2.1,nashorn,Java 8,Java Ee 7,Jpa 2.1,Nashorn,命令行nashorn脚本(jjs)无法创建实体管理器。 为什么这不起作用 如何使其工作(如果有) i、 e 运行脚本看起来像这样 $ jjs -cp ".;myjpaclasses-1.jar;" myNashornScript.js i、 例如,“myNashornScript.js”中包含 /* global Java, java */ print("begin test..."); var EntityManagerFactory = Java.typ
- 为什么这不起作用
- 如何使其工作(如果有)
$ jjs -cp ".;myjpaclasses-1.jar;" myNashornScript.js
i、 例如,“myNashornScript.js”中包含
/* global Java, java */
print("begin test...");
var EntityManagerFactory = Java.type('javax.persistence.EntityManagerFactory');
var EntityManager = Java.type('javax.persistence.EntityManager');
var Persistence = Java.type('javax.persistence.Persistence');
var Employees = Java.type('aaa.bbb.ccc.jpa.Employees');
var employees = new Employees();
var javaImports = new JavaImporter(java.io, java.lang, java.util);
try
{
with (javaImports) {
var emf = Persistence.createEntityManagerFactory("hr_pu"); <== issue here(?)...
var em = emf.createEntityManager();
var query = em.createQuery(
"SELECT e FROM Employees e WHERE e.employeeId > ?1")
.setParameter(1, 100)
.setFirstResult(0);
var rows = query.getResultList();
//...print info on 2nd row object of returned list...
//...print returned list size...
print("rows.get(2).getFirstName()="+ rows.get(2).getFirstName()
+ "...returned row count=" + rows.size());
}
} catch (e) {
print(e.message);
}
print("end test...");
注意:fwiw,当从java应用程序调用该脚本时,该脚本似乎工作正常…即
package aaa.bbb.ccc.jar;
import java.io.FileNotFoundException;
import java.io.FileReader;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class RunScript {
public static void main (String[] args) throws ScriptException, FileNotFoundException
{
ScriptEngineManager engineManager = new ScriptEngineManager();
ScriptEngine engine = engineManager.getEngineByName("nashorn");
engine.eval(new FileReader("src/main/resources/myNashornScript.js"));
}
}
…即,产生
begin test...
[EL Warning]: transaction: 2016-05-12 14:18:00.773--ServerSession(1829217853)--PersistenceUnitInfo hr_pu has transactionType RESOURCE_LOCAL and therefore jtaDataSource will be ignored
[EL Info]: 2016-05-12 14:18:00.78--ServerSession(1829217853)--EclipseLink, version: Eclipse Persistence Services - 2.6.3.v20160428-59c81c5
[EL Info]: connection: 2016-05-12 14:18:01.183--ServerSession(1829217853)--/file:/C:/tools/netbeansWS/myjpaclasses/target/classes/_hr_pu login successful
rows.get(2).getFirstName()=Alexander...returned row count=106
end test...
感谢您的帮助/指导
附言
如果有什么不同,persistence.xml(位于“myjpaclasses.jar”的src/main/resources/META-INF中)如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="hr_pu" transaction-type="RESOURCE_LOCAL">
<jta-data-source>jdbc/HR</jta-data-source>
<class>aaa.bbb.ccc.jpa.Regions</class>
<class>aaa.bbb.ccc.jpa.Employees</class>
<class>aaa.bbb.ccc.jpa.Departments</class>
<class>aaa.bbb.ccc.jpa.Locations</class>
<class>aaa.bbb.ccc.jpa.Jobs</class>
<class>aaa.bbb.ccc.jpa.Countries</class>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="javax.persistence.jdbc.driver" value="oracle.jdbc.OracleDriver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@localhost:1521:XE"/>
<property name="javax.persistence.jdbc.user" value="HR"/>
<property name="javax.persistence.jdbc.password" value="HR"/>
</properties>
</persistence-unit>
</persistence>
package aaa.bbb.ccc.jpa;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.UniqueConstraint;
import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD)
@Entity
@Table(name = "EMPLOYEES", uniqueConstraints = @UniqueConstraint(columnNames = {"EMAIL"}))
@XmlRootElement
public class Employees implements Serializable {
@Column(name = "LAST_NAME", table = "EMPLOYEES", nullable = false, length = 25)
@Basic
private String lastName;
@Column(name = "HIRE_DATE", table = "EMPLOYEES", nullable = false)
@Temporal(TemporalType.TIMESTAMP)
@Basic
private Date hireDate;
@ManyToOne(targetEntity = Departments.class)
@JoinColumn(name = "DEPARTMENT_ID", referencedColumnName = "DEPARTMENT_ID")
private Departments departmentId;
@Column(name = "EMPLOYEE_ID", table = "EMPLOYEES", nullable = false)
@Id
private Integer employeeId;
@ManyToOne(targetEntity = Employees.class)
@JoinColumn(name = "MANAGER_ID", referencedColumnName = "EMPLOYEE_ID")
private Employees managerId;
@Column(name = "SALARY", table = "EMPLOYEES", scale = 2, precision = 8)
@Basic
private BigDecimal salary;
@Column(name = "COMMISSION_PCT", table = "EMPLOYEES", scale = 2, precision = 2)
@Basic
private BigDecimal commissionPct;
@XmlTransient
@OneToMany(targetEntity = Employees.class, mappedBy = "managerId")
private List<Employees> employeesCollection;
@Column(name = "FIRST_NAME", table = "EMPLOYEES", length = 20)
@Basic
private String firstName;
@ManyToOne(optional = false, targetEntity = Jobs.class)
@JoinColumn(name = "JOB_ID", referencedColumnName = "JOB_ID")
private Jobs jobId;
@Column(name = "PHONE_NUMBER", table = "EMPLOYEES", length = 20)
@Basic
private String phoneNumber;
@XmlTransient
@OneToMany(targetEntity = Departments.class, mappedBy = "managerId")
private List<Departments> departmentsCollection;
@Column(name = "EMAIL", table = "EMPLOYEES", nullable = false, length = 25)
@Basic
private String email;
public Employees() {
}
public String getLastName() {
return this.lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public Date getHireDate() {
return this.hireDate;
}
public void setHireDate(Date hireDate) {
this.hireDate = hireDate;
}
public Departments getDepartmentId() {
return this.departmentId;
}
public void setDepartmentId(Departments departmentId) {
this.departmentId = departmentId;
}
public Integer getEmployeeId() {
return this.employeeId;
}
public void setEmployeeId(Integer employeeId) {
this.employeeId = employeeId;
}
public Employees getManagerId() {
return this.managerId;
}
public void setManagerId(Employees managerId) {
this.managerId = managerId;
}
public BigDecimal getSalary() {
return this.salary;
}
public void setSalary(BigDecimal salary) {
this.salary = salary;
}
public BigDecimal getCommissionPct() {
return this.commissionPct;
}
public void setCommissionPct(BigDecimal commissionPct) {
this.commissionPct = commissionPct;
}
@XmlTransient
public List<Employees> getEmployeesCollection() {
return this.employeesCollection;
}
public void setEmployeesCollection(List<Employees> employeesCollection) {
this.employeesCollection = employeesCollection;
}
public String getFirstName() {
return this.firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public Jobs getJobId() {
return this.jobId;
}
public void setJobId(Jobs jobId) {
this.jobId = jobId;
}
public String getPhoneNumber() {
return this.phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
@XmlTransient
public List<Departments> getDepartmentsCollection() {
return this.departmentsCollection;
}
public void setDepartmentsCollection(List<Departments> departmentsCollection) {
this.departmentsCollection = departmentsCollection;
}
public String getEmail() {
return this.email;
}
public void setEmail(String email) {
this.email = email;
}
}
jdbc/HR
aaa.bbb.ccc.jpa.地区
aaa.bbb.ccc.jpa.员工
aaa.bbb.ccc.jpa.部门
aaa.bbb.ccc.jpa.位置
aaa.bbb.ccc.jpa.Jobs
aaa.bbb.ccc.jpa.国家/地区
假的
JPA“Employee”类如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="hr_pu" transaction-type="RESOURCE_LOCAL">
<jta-data-source>jdbc/HR</jta-data-source>
<class>aaa.bbb.ccc.jpa.Regions</class>
<class>aaa.bbb.ccc.jpa.Employees</class>
<class>aaa.bbb.ccc.jpa.Departments</class>
<class>aaa.bbb.ccc.jpa.Locations</class>
<class>aaa.bbb.ccc.jpa.Jobs</class>
<class>aaa.bbb.ccc.jpa.Countries</class>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="javax.persistence.jdbc.driver" value="oracle.jdbc.OracleDriver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@localhost:1521:XE"/>
<property name="javax.persistence.jdbc.user" value="HR"/>
<property name="javax.persistence.jdbc.password" value="HR"/>
</properties>
</persistence-unit>
</persistence>
package aaa.bbb.ccc.jpa;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.UniqueConstraint;
import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD)
@Entity
@Table(name = "EMPLOYEES", uniqueConstraints = @UniqueConstraint(columnNames = {"EMAIL"}))
@XmlRootElement
public class Employees implements Serializable {
@Column(name = "LAST_NAME", table = "EMPLOYEES", nullable = false, length = 25)
@Basic
private String lastName;
@Column(name = "HIRE_DATE", table = "EMPLOYEES", nullable = false)
@Temporal(TemporalType.TIMESTAMP)
@Basic
private Date hireDate;
@ManyToOne(targetEntity = Departments.class)
@JoinColumn(name = "DEPARTMENT_ID", referencedColumnName = "DEPARTMENT_ID")
private Departments departmentId;
@Column(name = "EMPLOYEE_ID", table = "EMPLOYEES", nullable = false)
@Id
private Integer employeeId;
@ManyToOne(targetEntity = Employees.class)
@JoinColumn(name = "MANAGER_ID", referencedColumnName = "EMPLOYEE_ID")
private Employees managerId;
@Column(name = "SALARY", table = "EMPLOYEES", scale = 2, precision = 8)
@Basic
private BigDecimal salary;
@Column(name = "COMMISSION_PCT", table = "EMPLOYEES", scale = 2, precision = 2)
@Basic
private BigDecimal commissionPct;
@XmlTransient
@OneToMany(targetEntity = Employees.class, mappedBy = "managerId")
private List<Employees> employeesCollection;
@Column(name = "FIRST_NAME", table = "EMPLOYEES", length = 20)
@Basic
private String firstName;
@ManyToOne(optional = false, targetEntity = Jobs.class)
@JoinColumn(name = "JOB_ID", referencedColumnName = "JOB_ID")
private Jobs jobId;
@Column(name = "PHONE_NUMBER", table = "EMPLOYEES", length = 20)
@Basic
private String phoneNumber;
@XmlTransient
@OneToMany(targetEntity = Departments.class, mappedBy = "managerId")
private List<Departments> departmentsCollection;
@Column(name = "EMAIL", table = "EMPLOYEES", nullable = false, length = 25)
@Basic
private String email;
public Employees() {
}
public String getLastName() {
return this.lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public Date getHireDate() {
return this.hireDate;
}
public void setHireDate(Date hireDate) {
this.hireDate = hireDate;
}
public Departments getDepartmentId() {
return this.departmentId;
}
public void setDepartmentId(Departments departmentId) {
this.departmentId = departmentId;
}
public Integer getEmployeeId() {
return this.employeeId;
}
public void setEmployeeId(Integer employeeId) {
this.employeeId = employeeId;
}
public Employees getManagerId() {
return this.managerId;
}
public void setManagerId(Employees managerId) {
this.managerId = managerId;
}
public BigDecimal getSalary() {
return this.salary;
}
public void setSalary(BigDecimal salary) {
this.salary = salary;
}
public BigDecimal getCommissionPct() {
return this.commissionPct;
}
public void setCommissionPct(BigDecimal commissionPct) {
this.commissionPct = commissionPct;
}
@XmlTransient
public List<Employees> getEmployeesCollection() {
return this.employeesCollection;
}
public void setEmployeesCollection(List<Employees> employeesCollection) {
this.employeesCollection = employeesCollection;
}
public String getFirstName() {
return this.firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public Jobs getJobId() {
return this.jobId;
}
public void setJobId(Jobs jobId) {
this.jobId = jobId;
}
public String getPhoneNumber() {
return this.phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
@XmlTransient
public List<Departments> getDepartmentsCollection() {
return this.departmentsCollection;
}
public void setDepartmentsCollection(List<Departments> departmentsCollection) {
this.departmentsCollection = departmentsCollection;
}
public String getEmail() {
return this.email;
}
public void setEmail(String email) {
this.email = email;
}
}
包aaa.bbb.ccc.jpa;
导入java.io.Serializable;
导入java.math.BigDecimal;
导入java.util.Date;
导入java.util.List;
导入javax.persistence.Basic;
导入javax.persistence.Column;
导入javax.persistence.Entity;
导入javax.persistence.Id;
导入javax.persistence.JoinColumn;
导入javax.persistence.manytone;
导入javax.persistence.OneToMany;
导入javax.persistence.Table;
导入javax.persistence.Temporal;
导入javax.persistence.TemporalType;
导入javax.persistence.UniqueConstraint;
导入javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD)
@实体
@表(name=“EMPLOYEES”,uniqueConstraints=@UniqueConstraint(columnNames={“EMAIL”}))
@XmlRootElement
公共类Employees实现可序列化{
@列(name=“LAST_name”,table=“EMPLOYEES”,nullable=false,length=25)
@基本的
私有字符串lastName;
@列(name=“HIRE\u DATE”,table=“EMPLOYEES”,nullable=false)
@时态(TemporalType.TIMESTAMP)
@基本的
私人约会;
@多通(targetEntity=Departments.class)
@JoinColumn(name=“DEPARTMENT\u ID”,referencedColumnName=“DEPARTMENT\u ID”)
私家部门ID;
@列(name=“EMPLOYEE\u ID”,table=“EMPLOYEES”,nullable=false)
@身份证
私有整数employeeId;
@多通(targetEntity=Employees.class)
@JoinColumn(name=“MANAGER\u ID”,referencedColumnName=“EMPLOYEE\u ID”)
私人雇员;
@列(name=“SALARY”,table=“EMPLOYEES”,标尺=2,精度=8)
@基本的
私人薪酬;
@列(name=“佣金”,table=“员工”,比例=2,精度=2)
@基本的
私人大十进位佣金;
@XmlTransient
@OneToMany(targetEntity=Employees.class,mappedBy=“managerId”)
私人名单雇员集合;
@列(name=“FIRST_name”,table=“EMPLOYEES”,长度=20)
@基本的
私有字符串名;
@manytone(可选=false,targetEntity=Jobs.class)
@JoinColumn(name=“JOB\u ID”,referencedColumnName=“JOB\u ID”)
私人职位;
@列(name=“PHONE\u NUMBER”,table=“EMPLOYEES”,长度=20)
@基本的
私有字符串电话号码;
@XmlTransient
@OneToMany(targetEntity=Departments.class,mappedBy=“managerId”)
私人名单部门集合;
@列(name=“EMAIL”、table=“EMPLOYEES”、nullable=false、length=25)
@基本的
私人字符串电子邮件;
公职人员(){
}
公共字符串getLastName(){
返回this.lastName;
}
public void setLastName(字符串lastName){
this.lastName=lastName;
}
公开日期getHireDate(){
把这个还给我;
}
公共无效截止日期(截止日期){
this.hireDate=hireDate;
}
公共部门getDepartmentId(){
返回此.departmentId;
}
公共作废setDepartmentId(部门ID){
this.departmentId=部门ID;
}
公共整数getEmployeeId(){
返回此.employeeId;
}
public void setEmployeeId(整数employeeId){
this.employeeId=employeeId;
}
公共雇员getManagerId(){
返回这个.managerId;
}
public void setManagerId(Employees managerId){
this.managerId=managerId;
}
公共工资(){
退还此工资;
}
公共无效设置薪资(大十进制薪资){
这个。薪水=薪水;
}
public BigDecimal getCommissionPct(){
返回此.commissionPct;
}
公共无效设置佣金PCT(BigDecimal佣金PCT){
this.commissionPct=commissionPct;
}
@XmlTransient
公共列表getEmployeesCollection(){
返回此.employeesCollection;
}
公共作废setEmployeesCollection(列出employeesCollection){
this.employeescolection=employeescolection;
}
公共字符串getFirstName(){
返回这个.firstName;
}
public void setFirstName(字符串firstName){
this.firstName=firstName;
}
公共作业getJobId(){
返回此.jobId;
}
public void setJobId(Jobs jobId){
this.jobId=jobId;
}
公共字符串getPhoneNumber(){
返回此.phoneNumber;
}
public void setPhoneNumber(字符串phoneNumber){
var EntityManagerFactory = Java.type('javax.persistence.EntityManagerFactory');
// set the thread context class to be the loader of EntityManagerFactory class
var cls = EntityManagerFactory.class;
java.lang.Thread.currentThread().contextClassLoader = cls.classLoader;
//... rest of your script..