"N + 1选择问题"通常被称为对象关系映射(ORM)讨论中的一个问题,我理解它必须为对象中看起来很简单的事情做出大量的数据库查询.世界.
有没有人对这个问题有更详细的解释?
我知道JPA 2是一个规范,Hibernate是ORM的工具.另外,我知道Hibernate比JPA 2有更多的功能.但从实际的角度来看,真正的区别是什么?
我有使用iBatis的经验,现在我正在尝试学习Hibernate或JPA2.我选了Pro JPA2书,它一直指的是"JPA提供者".例如:
如果您认为某个功能应该标准化,那么您应该说出来并向您的JPA提供商索取
这让我很困惑,所以我有几个问题:
使用Hibernate保存对象时收到以下错误
object references an unsaved transient instance - save the transient instance before flushing
Run Code Online (Sandbox Code Playgroud) 我是Java Persistence API和Hibernate的新手.
Java Persistence API FetchType.LAZY和之间的区别是什么FetchType.EAGER?
有什么区别:
@Entity
public class Company {
@OneToMany(cascade = CascadeType.ALL , fetch = FetchType.LAZY)
@JoinColumn(name = "companyIdRef", referencedColumnName = "companyId")
private List<Branch> branches;
...
}
Run Code Online (Sandbox Code Playgroud)
和
@Entity
public class Company {
@OneToMany(cascade = CascadeType.ALL , fetch = FetchType.LAZY, mappedBy = "companyIdRef")
private List<Branch> branches;
...
}
Run Code Online (Sandbox Code Playgroud) 如果我订
<property name="show_sql">true</property>
Run Code Online (Sandbox Code Playgroud)
在我的控制台的hibernate.cfg.xml配置文件中,我可以看到SQL.
但它不是真正的 SQL ......我能看到将直接传递给数据库的SQL代码吗?
例:
我知道了
select this_.code from true.employee this_ where this_.code=?
Run Code Online (Sandbox Code Playgroud)
我可以看吗
select employee.code from employee where employee.code=12
Run Code Online (Sandbox Code Playgroud)
在真正的 SQL?
在尝试将具有双向关联的JPA对象转换为JSON时,我不断获取
org.codehaus.jackson.map.JsonMappingException: Infinite recursion (StackOverflowError)
Run Code Online (Sandbox Code Playgroud)
我找到的只是这个线程,基本上建议避免双向关联.有没有人对这个春天的bug有一个解决方法?
------编辑2010-07-24 16:26:22 -------
Codesnippets:
业务对象1:
@Entity
@Table(name = "ta_trainee", uniqueConstraints = {@UniqueConstraint(columnNames = {"id"})})
public class Trainee extends BusinessObject {
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
@Column(name = "id", nullable = false)
private Integer id;
@Column(name = "name", nullable = true)
private String name;
@Column(name = "surname", nullable = true)
private String surname;
@OneToMany(mappedBy = "trainee", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@Column(nullable = true)
private Set<BodyStat> bodyStats;
@OneToMany(mappedBy = "trainee", fetch = FetchType.EAGER, …Run Code Online (Sandbox Code Playgroud) 在Hibernate中是否可以使用实际值而不是问号来打印生成的SQL查询?
如果使用Hibernate API无法打印具有实际值的查询,您会建议如何?
我有一个包含5列的数据表,其中一行填充数据,然后通过事务保存到数据库.
保存时,会返回错误:
将datetime2数据类型转换为日期时间数据类型会导致超出范围的值
这意味着,正如所读,我的数据表有一种类型DateTime2和我的数据库a DateTime; 那是错的.
日期列设置为DateTime如下所示:
new DataColumn("myDate", Type.GetType("System.DateTime"))
题
这可以在代码中解决,还是必须在数据库级别上进行更改?
我使用很多Web应用程序,这些应用程序由后端不同复杂程度的数据库驱动.通常,存在与业务和表示逻辑分离的ORM层.这使得对业务逻辑的单元测试相当简单; 事物可以在离散模块中实现,测试所需的任何数据都可以通过对象模拟来伪造.
但是测试ORM和数据库本身一直充满了问题和妥协.
多年来,我尝试了一些策略,其中没有一个完全满足我.
使用已知数据加载测试数据库.针对ORM运行测试并确认正确的数据返回.这里的缺点是您的测试数据库必须跟上应用程序数据库中的任何模式更改,并且可能会不同步.它还依赖于人工数据,并且可能不会暴露由于愚蠢的用户输入而发生的错误.最后,如果测试数据库很小,它将不会显示缺失索引等低效率.(好吧,最后一个不是真的应该使用单元测试,但它没有受到伤害.)
加载生产数据库的副本并对其进行测试.这里的问题是你可能不知道在任何给定时间生产数据库中有什么; 如果数据随时间变化,您的测试可能需要重写.
有些人指出,这两种策略都依赖于特定的数据,单元测试应该只测试功能.为此,我见过建议:
您使用了哪些策略来测试数据库驱动的应用程序?什么对你有用?
orm ×10
java ×7
hibernate ×6
jpa ×3
sql ×2
c# ×1
database ×1
datetime ×1
jackson ×1
java-ee ×1
json ×1
mocking ×1
one-to-many ×1
spring-mvc ×1
sql-server ×1
unit-testing ×1