我正在尝试用maven和eclipse创建一个非常简单的webapp,但我根本没有快乐,实际上是快乐的逆转.
我转到File - > New Project,选择Maven Project,然后选择maven-archetype-webapp.当我完成向导时,会生成一个webapp结构,但在main下没有'java'目录,只有资源和webapp.
所以我右键单击main并选择新的Class.该类是在资源(?!)下创建的,而且,java似乎没有对它进行编译.我可以制作愚蠢的错误,并且不会出现语法突出显示.这就像java没有认识到它.
或者我尝试在main应该创建一个新的'java'目录,但仍然具有相同的不存在的java症状.
是什么赋予了?这让我很疯狂..
谢谢大家!
我对在开发和生产环境中使用maven感到困惑 - 我确信这很简单,我很遗憾.感谢任何帮助..
我在本地机器上的eclipse中设置了maven并编写了一些软件.我真的很喜欢它包括依赖罐子这样的东西很容易.
这就是我的开发环境.但现在我想在远程服务器上将项目发布到生产中.我搜索了文档,但我无法弄清楚它应该如何工作或maven最佳实践是什么..你应该:
a)还要在生产环境中运行maven,并将所有文件上传到生产环境并在那里重建项目?(我在生产服务器上重建"已发布"代码的想法让我感到不满,所以我很确定这是不对的..)
b)使用mvn:package创建你的jar文件,然后将其复制到生产中?(但那么所有那些好的依赖项是什么?是不是存在一个危险,你的测试代码现在将在生产环境中针对不同版本的从属jar运行,可能会破坏你的代码?或者缺少一个jar ...? )
c)其他我不知道的东西..
在此先感谢您的帮助!
我有两个类,Test2和Test3.Test2有一个属性test3,它是Test3的一个实例.换句话说,我有一个单向的OneToOne关联,test2引用了test3.
当我从db中选择Test2时,我可以看到正在进行单独的选择以获取相关test3类的详细信息.这是着名的1 + N选择问题.
要修复此问题以使用单个选择,我尝试使用fetch = join注释,我理解为@Fetch(FetchMode.JOIN)
但是,如果将fetch设置为join,我仍会看到单独的选择.以下是我的设置的相关部分..
hibernate.cfg.xml中:
<property name="max_fetch_depth">2</property>
Run Code Online (Sandbox Code Playgroud)
测试2:
public class Test2 {
@OneToOne (cascade=CascadeType.ALL , fetch=FetchType.EAGER)
@JoinColumn (name="test3_id")
@Fetch(FetchMode.JOIN)
public Test3 getTest3() {
return test3;
}
Run Code Online (Sandbox Code Playgroud)
NB我将FetchType设置为EAGER绝望,即使它无论如何都默认为EAGER OneToOne映射,但它没有任何区别.
谢谢你的帮助!
编辑:我几乎放弃了尝试使用FetchMode.JOIN - 任何人都可以确认他们已经让它工作,即产生左外连接?在文档中,我看到"通常,映射文档不用于自定义提取.相反,我们保留默认行为,并使用HQL中的左连接提取覆盖特定事务"
如果我做一个左连接取代:
query = session.createQuery("来自Test2 t2 left join fetch t2.test3");
然后我确实得到了我想要的结果 - 即查询中的左外连接.
Edit number 2:
Guys, thank you so much for your responses. Now I want to get to the bottom of this. I usually find that when I investigate something, I end up …
我试图了解 hibernate 在幕后所做的事情,并且我使用 p6spy 作为 mysql jdbc 驱动程序的代理,这样我就可以看到数据库真正发生了什么。然而,我对 p6spy 的输出有点困惑 - 感谢任何光线!
问题是这样的。我正在创建 Test1 类的两个新对象,即 test1a 和 test1b。我的日志中的输出如下:
Hibernate:
/* insert com.play.hibernate1.Test1
*/ insert
into
Test1
(name, value, id)
values
(?, ?, ?)
1274973057265|1|1|batch|/* insert com.play.hibernate1.Test1 */ insert into Test1 (name, value, id) values (?, ?, ?)|/* insert com.play.hibernate1.Test1 */ insert into Test1 (name, value, id) values ('Test 1', 10, 5)
Hibernate:
/* insert com.play.hibernate1.Test1
*/ insert
into
Test1
(name, value, id)
values
(?, ?, ?)
1274973057265|0|1|batch|/* insert com.play.hibernate1.Test1 */ …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用ehcache实现来获得二级hibernate缓存.
我确定这是我正在做的一些明显的noob错误,但我看不出它是什么!
为了测试我的缓存,我正在做以下事情:
创建一个对象并保存它.我在事务中得到了一次,在那里我可以看到我在没有数据库命中的情况下返回对象,这只是休眠的第一级缓存.
然后我提交事务并开始一个新会话.
这次,当我'得到'对象时,我可以在调试中看到来自ehcache的缓存未命中.因为我将它保存在上一个事务中,所以我原本期望该对象在缓存中?
这是我的代码:
Session session = getSession();
session.beginTransaction();
Test1 test1a = new Test1();
test1a.setId(5);
test1a.setName("Test 1");
test1a.setValue(10);
// Touch it
session.save(test1a);
// Now get it
Test1 test1b = (Test1)session.get(Test1.class, 5);
// Within a transaction, the session caches it - no db hit
System.out.println("GOT object with value "+test1b.getValue());
session.getTransaction().commit();
System.out.println("Between sessions");
session = getSession();
session.beginTransaction();
test1b = (Test1)session.get(Test1.class, 5);
System.out.println("GOT object with value "+test1b.getValue());
session.getTransaction().commit();
Run Code Online (Sandbox Code Playgroud)
这是我的hibernate.cfg.xml的相关部分
<property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
Run Code Online (Sandbox Code Playgroud)
还有我的ehcache.xml
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ehcache.sf.net/ehcache.xsd">
<cache name="com.play.hibernate1.Test1" …Run Code Online (Sandbox Code Playgroud) 通过Head First Design Patterns一书的工作方式.
我相信我理解简单的工厂和工厂方法,但我很难看到工厂方法带来的简单工厂优势.
如果对象A使用简单工厂来创建其B对象,则客户端可以像这样创建它:
A a = new A(new BFactory());
Run Code Online (Sandbox Code Playgroud)
而如果一个对象使用工厂方法,客户端可以像这样创建它:
A a = new ConcreteA(); // ConcreteA contains a method for instantiating
// the same Bs that the BFactory above creates, with
// the method hardwired into the subclass of A, ConcreteA.
Run Code Online (Sandbox Code Playgroud)
因此,在简单工厂的情况下,客户端使用B工厂组成A,而使用工厂方法,客户端为其想要的B类型选择适当的子类.
他们之间似乎没有多少选择.要么你必须选择你想要用哪个BFactory,要么你必须选择A的正确子类来给你Bs.
在什么情况下哪一个比另一个好?
谢谢大家!
编辑:添加一点混乱IMO是Head First叙述中给出的解释,他们从简单的工厂转换到工厂方法,说(第119页)"特许经营权正在使用你的[简单]工厂创造比萨饼,但开始在剩下的过程中采用他们自己的本土程序:他们将事情稍微区别开来......"他们有一张厨师的照片,他显然做了一些令人厌恶的比萨饼.
但是没有什么可以使用一个简单的工厂来让客户访问bake()方法或进程的任何其他部分.并且没有任何关于使用工厂方法如果有任何问题会有所帮助.
所以在我看来,首先暗示在一家简单工厂使用工厂方法的原因是假的.
我正在试图找出开发和发布一个相当简单的Web应用程序的最佳方法,而且我遇到了几个问题.我将概述我所做出的决定,因为在某个地方,我显然已经脱离了轨道.非常感谢任何帮助!
我认为这是一个相当简单的Web应用程序.它包含一些引用几个java bean的jsps,以及通常的静态html,js,css和images.
决定1)我希望有一个清晰,干净的发布程序,这样我就可以在我的本地机器上进行开发,然后可靠地发布到生产机器上.因此,我决定将应用程序打包成war文件(包括所有静态资源),以最小化我需要释放的单独的部分.到现在为止还挺好?
决定2)我希望本地机器上的东西尽可能与生产环境相似.因此,在我的html中,我可能会引用一个静态文件,例如http://static.foo.com/file.为了使这段代码能够在dev和prod上无缝工作,我决定在本地开发时将static.foo.com放在我的/ etc/hosts中,这样所有的url都能正常工作而不会改变任何东西.
决定3)我决定使用eclipse和maven为我提供管理和构建项目的最佳实践环境.
所以我现在有一个很好的紧凑设置,除了:
每次我想改变开发中的任何东西,比如html文件中的一行,我必须重建整个项目然后等待tomcat加载战争才能看出它是否是我想要的.所以我的问题是:
1)有没有办法连接eclipse和tomcat,这样我每次都不需要重建战争?即tomcat直视我的实际工作空间来提供静态文件?
2)我认为通过使用/ etc/hosts来反映生产网址可能会让事情变得更难 - 是否有更好的方法不涉及手动更改网址(相对网址当然很好,但是你有很多子网域的地方) ,一个用于静态文件,一个用于动态,你必须写出完整的路径,当然?)
3)这真的是最好的做法吗?人们如何设置,以便一方面平衡自动化,无所不包的构建过程的需求,以及能够快速开发javascript和html和css的速度和灵活性,就像一个刚刚指出的那样快apache在目录下开发了吗?人们发现了什么?
非常感谢!
编辑:非常感谢您的回复!如果我能把它们标记好,我会......这真的帮助了我.我所听到的是,最佳实践是在开发中保留webapp的结构,并在尽可能接近生产的环境中运行它.似乎人们之间的差异在于人们准备将资源热部署到servlet容器的程度,以及为了一点额外的速度或便利而绕过构建过程.那讲得通.再次感谢.