我执行equals(),hashCode()并toString()通过在Bean所有可用字段我的实体.
当我尝试比较相等或者打印obj状态时,我在前端得到了一些Lazy init Exception.那是因为实体中的某些列表可以延迟初始化.
我想知道实现equals()和toString()实体对象的正确方法是什么.
我将使用外键在Employee和Team实体之间创建两个引用.所以我定义了两个实体如下
public class Employee
{
public int EmployeeId { get; set; }
public string Name { get; set; }
[ForeignKey("FirstTeam")]
public int FirstTeamId { get; set; }
[InverseProperty("FirstEmployees")]
public virtual Team FirstTeam { get; set; }
[ForeignKey("SecondTeam")]
public int SecondTeamId { get; set; }
[InverseProperty("SecondEmployees")]
public virtual Team SecondTeam { get; set; }
}
public class Team
{
public int Id { get; set; }
public string TeamName { get; set; }
[InverseProperty("FirstTeam")]
public virtual ICollection<Employee> FirstEmployees { get; set; …Run Code Online (Sandbox Code Playgroud) 我已经在这个问题上搜索了stackoverflow,并找到了一些主题,但我觉得在这方面我没有真正的答案.
我有一个用户提交的表单,字段的值存储在XML文件中.XML设置为使用UTF-8编码.
用户将不时地从某处复制/粘贴文本,当我得到"实体未定义错误"时.
我意识到XML只支持少数几个实体,除此之外的任何东西都无法识别 - 因此解析器错误.
从我收集的内容中,我看到了一些选项:
并将它们与 实际空间交换出来.我正在对XML文件做的是,用户可以将内容输入到表单中,将其存储在XML文件中,然后该内容在Web页面上显示为XHTML(使用SimpleXML解析).
在我不了解的三个选项或任何其他选项中,处理这些实体的最佳方法是什么?
谢谢,瑞恩
UPDATE
我要感谢大家的好评.我确实确定了导致我的实体错误的原因.所有的建议让我更深入地研究它!
一些文本框中有普通的旧文本框,但我的textareas使用TinyMCE进行了增强.事实证明,在仔细观察的同时,PHP警告总是引用来自TinyMCE增强型textareas的数据.后来我注意到在PC上所有角色都被取出了(因为它无法读取它们),但是在MAC上你可以看到引用该角色的unicode号的小方框.它首先出现在MAC上的正方形中的原因是因为我使用utf8_encode来编码不是UTF的数据以防止其他解析错误(这在某种程度上也与TinyMCE有关).
所有这些的解决方案非常简单:
我entity_encoding : "utf-8"在tinyMCE.init中添加了这一行.现在,所有角色都以他们应该的方式出现.
我想我唯一不理解的是为什么当放置在文本框中时字符仍然显示,因为没有任何东西将它们转换为UTF,但是使用TinyMCE这是一个问题.
这可能听起来很愚蠢,但为什么我需要在我的@Entitys中定义一个空构造函数?
我看到的每个教程都说:每个实体都需要一个空的构造函数.
但Java总是给你一个默认的不可见的空构造函数(如果你不重新定义一个).
谢谢.
我认为存在语义问题.我对"需要"所理解的是写作.
含义:始终在实体中编写一个空构造函数.
例:
@Entity
public class MyEntity implements Serializable {
@Id
private String str;
public MyEntity(){}
//here getter and setter
}
Run Code Online (Sandbox Code Playgroud)
但是当你不重新定义它时,Java总是给你这个空的构造函数(用参数写另一个).
在这种情况下,编写这个空构造函数似乎没用.
我正在使用实体框架.
在我的数据库中存储了人员和他们的国家.当我加载一个人物时,我不知道每个人的起源是什么.有没有办法缓存国家/地区列表,以便不会有不必要的请求.
是否可以确定实体的本机表名称?
如果存在Table注释,则很容易:
entityClass.getAnnotation(Table.class).name()
Run Code Online (Sandbox Code Playgroud)
但是如果没有Table注释呢?
Hibernate通过Configuration类提供此信息:
configuration.getClassMapping(entityClass.getSimpleName()).getTable().getName()
Run Code Online (Sandbox Code Playgroud)
JPA中有类似的东西吗?
我有两个实体:用户和人.
在实体用户中,我需要关联人员的id:user_id.
当我创建一个新用户时,我必须首先创建一个人,然后创建用户.在用户中,我必须输入相应人员的id,为此我需要获取持久对象人员的id,这是一个自动增量.
是否有可能获得对象的id后:
$em->persist($person);
$em->flush();
Run Code Online (Sandbox Code Playgroud)
我怎么能这样做?
另一种方法是在表Person中搜索最大的id并取这个,但我认为应该有一个更好更容易的方法来获取持久化对象的id.
以php为例,当我执行时
$articleID = $_DB->queryRaw((....);
Run Code Online (Sandbox Code Playgroud)
我得到了那样的id.
在我们的遗留Java EE应用程序中,有许多值对象(VO)类,它们通常只包含getter和setter,也许equals()和hashCode().这些(通常)是要在持久性存储中保存的实体.(为了记录,我们的应用程序没有EJB - 尽管未来可能会发生变化 - 我们使用Hibernate来持久保存我们的实体.)操作VO中数据的所有业务逻辑都在不同的类中(不是EJB,只是POJO) ).我的OO心态讨厌这个,因为我确实认为给定类的操作应该驻留在同一个类中.所以我强烈要求重构将逻辑转移到相关的VO中.
我刚刚与一位在Java EE方面比我更有经验的同事进行了讨论,并且他证实了愚蠢的实体至少曾经是推荐的方式.不过,他最近也阅读了有关这一立场有效性的意见.
我知道有些问题至少限制了实体类中的内容:
有没有更合理的理由不将逻辑移入我的实体?还是要考虑其他任何问题?
我正在寻找一种智能且易于阅读的方式来获取持久化实体的id JPA.id是一个Integer.
人们可以想到以下解决方案:
GeneratedValue策略.这需要在持久化之前寻找一个免费的id,然后将它放入要保留的实体中:繁琐,但有效.GeneratedValue策略.持久性提供程序将负责id生成.这看起来更聪明,但如何获得身份证?请参阅下面的解决方案2
MyEntity en = new MyEntity();
en.setName("My name");
em.persist(en);
System.out.println(en.getId());
Run Code Online (Sandbox Code Playgroud)
这打印出一个空id!
有什么建议?我正在使用MySql,EclipseLink,但需要一个可移植的解决方案.