小编Did*_*jit的帖子

Spring-JPA:更新父实体无法保留新的子实体,而是将它们解释为Transient

我是Spring/JPA/Hibernate的新手,虽然听起来很简单,但事实并非如此.我可以使用一些帮助.

我有一个父实体,其中包含子实体列表.我会用这些来简化讨论:

@Entity
public class Parent {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;

    @OneToMany(fetch=FetchType.EAGER, cascade = CascadeType.ALL, mappedBy="parent")
    private List<Child> children= new ArrayList<Child>();

    etc...
}

@Entity
public class Child {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;

    @ManyToOne
    private Parent parent;

    etc...
}

@Repository
public interface ParentRepository extends JpaRepository<Parent, Long> {};
Run Code Online (Sandbox Code Playgroud)

第1轮,我创建一个新的父级和一个新的子级,将子级添加到父级列表并在子级上设置父级.当我保存父母时,孩子也被保存.

@Transactional(propagation=Propagation.REQUIRES_NEW)
void create() {
    Parent parent = new Parent();
    Child  child  = new Child();
    parent.add(child);
    child.setParent(parent);
    parent = repository.save(parent);
}
Run Code Online (Sandbox Code Playgroud)

现在,第2轮,我添加了一个新的孩子:

@Transactional(propagation=Propagation.REQUIRES_NEW)
void update() {
    Parent parent = repository.findOne(parentID);
    Child newChild …
Run Code Online (Sandbox Code Playgroud)

spring hibernate jpa transactional

6
推荐指数
1
解决办法
8414
查看次数

在Oracle SQL Developer中按相对路径执行脚本

首先,这个问题涉及Oracle SQL Developer 3.2,而不是SQL*Plus或iSQL等.我已经做了很多搜索,但还没有找到一个直接的答案.

我有几个脚本集合,我正在尝试自动化(顺便说一句,我的SQL经验非常基本,主要是基于MS的).我遇到的麻烦是通过相对路径执行它们.例如,假设此设置:

scripts/A/runAll.sql
       | /A1.sql
       | /A2.sql
       |
       /B/runAll.sql
         /B1.sql
         /B2.sql
Run Code Online (Sandbox Code Playgroud)

我想要一个这样的文件scripts/runEverything.sql:

@@/A/runAll.sql
@@/B/runAll.sql
Run Code Online (Sandbox Code Playgroud)

脚本/ A/runAll.sql:

@@/A1.sql
@@/A2.sql
Run Code Online (Sandbox Code Playgroud)

在那里"@@",我推测,是指在SQL*Plus相对路径.

我愚弄了制作变量,但没有太多运气.我已经能够'&1'在根目录中使用和传递类似的东西.即:scripts/runEverything.sql:

@'&1/A/runAll.sql' '&1/A'
@'&1/B/runAll.sql' '&1/B'
Run Code Online (Sandbox Code Playgroud)

并通过执行以下命令调用它:

@'c:/.../scripts/runEverything.sql' 'c:/.../scripts'
Run Code Online (Sandbox Code Playgroud)

但这里的问题是B/runAll.sql用路径调用:c:/.../scripts/A/B.

那么,SQL Developer是否可以进行嵌套调用,以及如何进行?

sql oracle relative-path sql-scripts oracle-sqldeveloper

6
推荐指数
1
解决办法
6万
查看次数

带有 CDI 的 JSF 2.3 中的会话固定和会话作用域 Bean

在用户登录时更新 HTTP 会话是一种常见的最佳实践。这将强制使用新的会话 ID,避免会话固定漏洞。

当涉及@SessionScoped bean 时,是否有使用 CDI 实现此功能的首选模式?困难在于,通过使当前的 HTTP 会话无效,您将在下一个请求中获得一个不同的会话范围的 bean,但直到下一个请求才会如此。

例如,假设一个会话 bean 用于存储用户登录信息:

@Named("sessionbean")
@SessionScoped
public class SessionBean implements Serializable {
    private int userId;
    private String username;
    private List<String> privileges;

    // Accessors omitted 
}
Run Code Online (Sandbox Code Playgroud)

另一个用于管理登录的 bean:

@Named("loginbean")
@ViewScoped
public class LoginBean implements Serializable {

    private String username;
    private String password;
    @Inject private SessionBean session;
    @Inject private SessionManager sessionManager;
    @Inject private PrivilegeManager privilegeManager;      

    public String doLogin() {
        String destinationUrl;

        if (validate(username, password)) {
            FacesContext context = FacesContext.getCurrentInstance();

            // force …
Run Code Online (Sandbox Code Playgroud)

session jsf cdi jsf-2.3

6
推荐指数
1
解决办法
702
查看次数

Tomcat服务内存超过max无故障

我已经阅读了大量帖子,但显然我在理解中遗漏了一些东西。我有一个 Tomcat 服务,它安装了:

--JvmMx=1000
--JvmMs=128
Run Code Online (Sandbox Code Playgroud)

我已经通过以下调用验证了这些设置是否成功:

PsExec.exe -s {jdk}\bin\jinfo.exe -flag MaxHeapSize {pid}
Run Code Online (Sandbox Code Playgroud)

但是,此服务的 tomcat7.exe 进程持续增长,超过此最大值的 3 倍或更多倍,直到它使服务器爬行。奇怪的是,这只是一台服务器上的问题;在其他任何地方,它都相当稳定,并保持在限制之下。我还在我的开发环境中寻找内存泄漏,但没有找到。

为了调试这个,我试过像这样强制 GC:

 PsExec.exe -s {jdk}\bin\jcmd.exe {pid} GC.run
Run Code Online (Sandbox Code Playgroud)

但这似乎没有效果。所以接下来我通过将它添加到安装中来设置 jconsole 监控:

tomcat7.exe //US//%SERVICE_NAME% ++JvmOptions="-Dcom.sun.management.jmxremote"
tomcat7.exe //US//%SERVICE_NAME% ++JvmOptions="-Dcom.sun.management.jmxremote.port=8086"
tomcat7.exe //US//%SERVICE_NAME% ++JvmOptions="-Dcom.sun.management.jmxremote.ssl=false"
tomcat7.exe //US//%SERVICE_NAME% ++JvmOptions="-Dcom.sun.management.jmxremote.authenticate=false"
Run Code Online (Sandbox Code Playgroud)

现在(当然!)它很乖。GC 显然工作正常,进程内存保持在限制以下。

我很困惑。最大堆是 1 GB,永久内存是 90 MB,堆栈大小是默认的,所以大约 128 KB?而没有增长的线程数“只有”67。那么进程内存如何上升到3+GB呢?为什么它不抛出内存不足异常?

即使是现在,根据 jconsole 的“行为良好”服务仅使用大约 50 MB 的堆,在 57 个线程上运行。然而,任务管理器显示 71 个线程使用 800 MB。我认为差异是由于 Tomcat 造成的,是吗?请帮助我填补我的理解空白。

java memory tomcat heap-memory

1
推荐指数
1
解决办法
947
查看次数