Java 8 命令行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

命令行nashorn脚本(jjs)无法创建实体管理器。

  • 为什么这不起作用

  • 如何使其工作(如果有)

i、 e

运行脚本看起来像这样

    $ 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..