Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate查找表:作为对象关系或代码/键_Java_Database_Hibernate_Orm_Lookup Tables - Fatal编程技术网

Java Hibernate查找表:作为对象关系或代码/键

Java Hibernate查找表:作为对象关系或代码/键,java,database,hibernate,orm,lookup-tables,Java,Database,Hibernate,Orm,Lookup Tables,因此,我正在开发一个包含大量关系和查找表的应用程序,但归根结底是: 人 id INT (PK) ... (name, address, etc) optcode VARCHAR (FK to Options) typecode VARCHAR (FK to Types) 选项 optcode VARCHAR (PK) optdesc VARCHAR ... (more meta data, like date added, etc) code VARCHAR (PK) desc VARCHA

因此,我正在开发一个包含大量关系和查找表的应用程序,但归根结底是:

id INT (PK)
... (name, address, etc)
optcode VARCHAR (FK to Options)
typecode VARCHAR (FK to Types)
选项

optcode VARCHAR (PK)
optdesc VARCHAR
... (more meta data, like date added, etc)
code VARCHAR (PK)
desc VARCHAR
... (more meta data, like date added, etc)
类型

optcode VARCHAR (PK)
optdesc VARCHAR
... (more meta data, like date added, etc)
code VARCHAR (PK)
desc VARCHAR
... (more meta data, like date added, etc)
我使用hibernate访问这些表,一方面,对象关系有好处,但另一方面,只使用字符串来编写代码效果更好

什么是更好的对象关系vs关键点vs两者

仅使用按键:

public class Person {
     private int id;
     ... (more attributes)
     private String optcode;
     private String typecode;
}
In the services:
Person person = new Person();
person.setOptcode("ABC");
person.setTypecode("XYZ");
session.save(person);
或O/R方式:

public class Person {
     private int id;
     ... (more attributes)
     @JoinColumn
     private Options option;
     @JoinColumn
     private Types type;
}
In the services:
Person person = new Person();
person.setOption(new Options("ABC")); //Assume constructor fills in the 'optcode'
person.setType(new Types("XYZ"));     //Same, with 'code'
session.save(person);
在大多数持久性的情况下,我只有“代码”,但很多时候在显示数据时,最好显示“desc”

由于我将有一个地方来管理选项和类型实体,这些实体无论如何都会存在,但必须将“代码”包装到对象中是很烦人的

你认为不同方法的优缺点是什么?如果我把两者都放在Person对象中,这样我就可以使用更方便的东西了?如何制作setter,将字符串推入新的选项/类型实体中

我正在尝试确定最佳的方法,以便保持一致性,现在我只是在做任何需要最少数量的新实体的事情,但最终一切都将由hibernate实体表示

更新:Person实体最终将拥有近20个唯一的实体关系(每个实体关系指向不同的表),web ui可能会有包含每个表的值的下拉列表,因此我希望只有用于持久性的“代码”。
相关:我实际上使用PersonImpl(普通POJO)和PersonEntity(Hibernate实体)以及Dozer映射来进行连接。

ORM的全部目的是为您提供一个对象图,您可以在其中导航,并映射到关系数据库。您应该能够使用
person.getOption().getDescription()
从person获取其选项描述

您还应该能够使用搜索具有给定选项日期的人员

select p from Person p where p.option.date = :date
只有将外键映射为关联(而不是字符串)时,才可能这样做

您不应该使用
新选项(code)
将现有选项放入您的个人,thouh。相反,您应该从会话中获取或加载选项:

Person p = new Person();
p.setOption((Option) session.load(Option.class, "ABC"));
p.setType((Type) session.load(Type.class, "XYZ"));
session.save(p);

// and now, this code works as expected:
System.out.println(p.getOption().getDescription());

一般来说,我认为实体关系使编码更容易,尤其是在查询对象时:有什么比说person.getOption().getDescription()更容易?但是,这种方法确实有缺点:

  • 引用的实体必须从数据库中加载,尤其是在保存级联时。您可能知道,在save cascade中,Hibernate会抱怨对象存在于数据库中。我不知道当你没有保存级联时会发生什么
  • 在加载主实体时,必须使用单独的查询或外部联接加载引用的实体。可能会导致性能问题
在复杂关系的情况下,将键作为单纯的属性进行持久化可能会有所帮助,例如,当引用一个大实体时,Hibernate需要完成大量的加载工作。这种方法有助于减轻系统加载“主”实体的负担。这确实意味着您必须自己加载实体,如果您需要它的属性。我想说的是,对于不可变的“查找”类型的实体,您可以安全地保留它们的实例的内存映射,并通过它们的键获取()它们,而不是转到数据库。缺点是您将对实体处理逻辑进行分区:您必须记住要缓存哪些实体并管理它们的缓存


我想说,一般来说,使用实体总是更好的,毕竟实体是您的模型。Hibernate坚持指出,它可以帮助您持久化对象模型以帮助您。然后将尽可能多的持久性内容委托给Hibernate是合乎逻辑的。然而,在有些情况下,Hibernate无法很好地处理“适当”的模型:具有许多关系的实体,“随时可用的热”实体,等等。在这些情况下,如果Hibernate的机制无法帮助您(例如,二级缓存),您真的必须求助于这些“技巧”然后自己做一些工作。

我想我会使用Hibernate的@MappedSuperclass来处理表有很多相同结构(“代码”、“描述”等)的情况,这样我就可以减少代码行的数量。但除此之外,O/R似乎是一条出路。

我遇到了这个问题,因为我想知道当人们遇到需要查找其他实体的实体时,他们在做什么。这样做的主要问题是,即使在测试中,您也不能再仅仅创建一个实例。我的首选方法是迁移到工厂或外部(例如非静态类)构建器

但总体而言,我的问题是它非常基本,而且涉及到很多容易出错的样板文件。例如,假设我有一个名为Listing的内容,我必须跟踪它的来源(我在哪里找到的)。源代码是一个非常简单的实体,但现在我在清单中有了对它的引用,如果不查找源代码,然后注入适当的源代码,我就不能再创建清单

如果可能的话,可以通过简单的注释来处理这个问题,例如mappedBy之类的东西,但引用id或名称,然后容器可以进行查找和注入


毫无疑问,我们很快就会看到这一点,尽管..

拥有对象图确实是一个优势,但当我执行session.save()时,它将返回填充的实体。此外,我正在使用Dozer进行从IMPL(非hibernate)到实体的bean映射,因此我将在那里遇到问题。在这个示例中,我只有2个关系,但在我的应用程序中,我有十几个关系,在最坏的情况下可能有20个关系。我想我把实体关系看作是在制造pe