Tag: java

如何在JPA(和相应的连接表行)中删除具有ManyToMany关系的实体?

假设我有两个实体:组和用户。 每个用户可以是多个组的成员,每个组可以有多个用户。 @Entity public class User { @ManyToMany Set<Group> groups; //… } @Entity public class Group { @ManyToMany(mappedBy="groups") Set<User> users; //… } 现在我想删除一个组(假设它有很多成员)。 问题是当我在某个Group上调用EntityManager.remove()时,JPA提供者(在我的情况下是Hibernate) 不会从连接表中删除行,并且由于外键约束,删除操作失败。 在用户上调用remove()可以正常工作(我想这与拥有关系的一方有关)。 那么在这种情况下我该如何删除一个组? 我唯一能想到的方式是加载组中的所有用户,然后为每个用户从他的组中删除当前组并更新用户。 但是,对于我来说,只要能够删除这个组就可以调用组中的每个用户的update(),这似乎是荒谬的。

将许多parameter passing给方法的最佳实践?

偶尔,我们必须编写接收许多参数的方法,例如: public void doSomething(Object objA , Object objectB ,Date date1 ,Date date2 ,String str1 ,String str2 ) { } 当我遇到这样的问题时,我经常把论据封装在地图中。 Map<Object,Object> params = new HashMap<Object,Object>(); params.put("objA",ObjA) ; …… public void doSomething(Map<Object,Object> params) { // extracting params Object objA = (Object)params.get("objA"); …… } 这不是一个好的做法,将params封装成地图完全是浪费效率。 好的是,干净的签名,容易添加其他参数修改最less。 这种问题最好的做法是什么?

如何提取apk文件的代码

其实我试图提取一个名为cloudfilz.apk的.apk文件的代码,并想操纵其源代码,所以我按照下面给出的步骤: 使一个新的文件夹,并把.apk文件(你想解码)现在重命名这个.apk文件扩展名为.zip(例如:从filename.apk重命名为filename.apk.zip),并保存它..现在你得到类.dex文件等…在这个阶段,你可以看到可绘制的,但不是XML和Java文件…所以继续… 第2步: 现在解压缩这个zip文件在同一个文件夹(在这个例子或案例新的文件夹)。 现在从这个链接http://code.google.com/p/dex2jar/下载dex2jar并将其解压缩到相同的文件夹(在本例中为新文件夹)…..现在打开命令提示符并进入该文件夹(在这种情况下新的文件夹)….达到写“dex2jar classes.dex”,并按下input…..现在你得到classes.dex.dex2jar文件在同一个文件夹…… =>问题:-I是成功实现步骤1,但在步骤2当我执行dex2jar classes.dex我得到一个错误命令提示符java.lang.UnsupportedClassVersionError ,我知道这是由于我安装的JDK版本和类之间的不兼容.dex jdk版本号如此卡在这里和dnt有出路…

是不稳定的昂贵?

阅读JSR-133编译器编写者手册,了解易失性的实现,特别是“与primefaces指令的交互”部分。我假设读取一个易失性variables而不更新它需要一个LoadLoad或一个LoadStore的障碍。 再往下看,LoadLoad和LoadStore在X86 CPU上是无效的。 这是否意味着可以在x86上执行易失性读操作而不显示caching失效,并且像正常variables读取一样快(不考虑volatile的重sorting约束)? 我相信我不明白这一点。 有人能照顾我吗? 编辑:我不知道在多处理器环境中是否有差异。 在单CPU系统上,CPU可能会看它自己的线程caching,正如John V.指出的那样,但是在多CPU系统中,CPU必须有一些configuration选项,这是不够的,主存必须被命中,使得volatile变慢在多CP​​U系统上,对吗? PS:在我学习更多关于这个的方法中,我偶然发现了以下很棒的文章,因为这个问题可能对别人很有趣,所以我会在这里分享我的链接: Java理论与实践:修复Java存储模型,第1部分和 Java理论与实践:修复Java内存模型,第2部分

为什么实现接口的抽象类可能会错过接口方法之一的声明/实现?

在使用抽象类来实现一个接口时,Java中会出现一个奇怪的事情:一些接口的方法可能完全丢失(即,既没有抽象声明也没有实际的实现),但是编译器不会抱怨。 例如,给定接口: public interface IAnything { void m1(); void m2(); void m3(); } 下面的抽象类快速编译没有警告或错误: public abstract class AbstractThing implements IAnything { public void m1() {} public void m3() {} } 你能解释一下为什么?

JPA OneToMany不删除孩子

我有一个父和@OneToMany之间简单的@OneToMany映射的问题。 一切正常,只有当我从集合中删除它们时,子logging才会被删除。 父母: @Entity public class Parent { @Id @Column(name = "ID") private Long id; @OneToMany(cascade = {CascadeType.ALL}, mappedBy = "parent") private Set<Child> childs = new HashSet<Child>(); … } 小孩: @Entity public class Child { @Id @Column(name = "ID") private Long id; @ManyToOne(cascade = CascadeType.ALL) @JoinColumn(name="PARENTID", nullable = false) private Parent parent; … } 如果我现在从子集Set中删除子元素,它不会从数据库中删除。 […]

如何在Spring Security / SpringMVC中手动设置经过身份validation的用户

新用户提交“新帐户”表单后,我想手动将该用户login,以便他们不必在后续页面上login。 通过spring安全拦截器的正常forms的login页面工作得很好。 在新帐户表单控制器中,我将创build一个UsernamePasswordAuthenticationToken并手动将其设置在SecurityContext中: SecurityContextHolder.getContext().setAuthentication(authentication); 在同一页上,我稍后检查用户是否login: SecurityContextHolder.getContext().getAuthentication().getAuthorities(); 这返回了我之前在身份validation中设置的权限。 一切都很好。 但是,当我加载的下一页上调用相同的代码时,身份validation令牌只是UserAnonymous。 我不清楚为什么它没有保持我以前的请求设置的身份validation。 有什么想法吗? 会话ID的设置是否正确? 有什么可能覆盖我的身份validation? 也许我只需要另一个步骤来保存身份validation? 还是有什么我需要做的是在整个会话中声明身份validation,而不是一个单一的请求? 只是寻找一些想法,可以帮助我看看这里发生了什么。

如何从Eclipse中现有的源创build一个项目,然后find它?

我创build了几个.java文件。 所有这些都位于一个目录中。 我用一个文本编辑器来写这些文件。 现在我想切换到Eclipse。 我该怎么做? 我尝试了很多方法。 他们都没有工作。 添加: 我认为常用的方法是在eclipse文件夹中有一个名为“workspace”的源文件。 那么,我如何在这些目录中获取我的文件。 我应该使用eclipse从现有的源创build一个新的项目和Eclipse将把所有的文件到工作区? 或者我应该手动将所有的文件复制到工作区? 我应该把我的class级文件放在哪里? 我应该创build一个子目录吗? 用哪个名字? 加2: 当我尝试创build一个名称为“游戏”的项目时,eclipse写道,具有这种名称的项目已经存在。 但是我怎样才能打开这个项目? 加3: 在我的“工作区”中,我创build了一个名为“游戏”的子目录。 我把我所有的.java文件复制到这个子目录中。 然后用Eclipse创build一个名为游戏的新项目。 因此,Eclipse在目录“game”中创build了.classpath和.project文件。 它还创build了bin和src子目录。 现在我认为这是不正确的。 源文件应该在“src”目录中。 对? 而目前我所有的.java文件都在“工作区\游戏”中。 加4: 我以其他方式做了。 在Eclipse中,我创build了一个名为“游戏”的新项目。 结果,Eclipse在文件夹“workspace”中创build了一个名为“game”的文件夹。 在“游戏”文件夹中我find了“src”文件夹。 我把我所有的.java文件复制到这个文件夹中。 但是现在在“包资源pipe理器”中,我无法打开“src”文件夹。 那么,如何从Eclipse访问我的源文件呢? 为什么Eclipse不想打开“src”文件夹?

我应该使用@EJB还是@Inject

我发现这个问题: @Inject和@EJB有什么区别,但我没有得到任何明智的。 我以前没有做过Java EE,也没有使用dependency injection的经验,所以我不明白我应该使用什么? 是@EJB和旧的注射方式? 在使用@Inject时使用此批注时,EJB容器是否使用新的CDI框架进行注入? 这是不同的,如果是这样的话,我应该使用@Inject而不是@EJB?

如何通过构造来初始化HashSet值?

我需要用初始值创build一个Set 。 Set<String> h = new HashSet<String>(); h.add("a"); h.add("b"); 有没有办法在一行代码中做到这一点?