Hibernate中persist()和merge()有什么区别?
persist() 可以创建UPDATE和INSERT查询,例如:
SessionFactory sef = cfg.buildSessionFactory();
Session session = sef.openSession();
A a=new A();
session.persist(a);
a.setName("Mario");
session.flush();
Run Code Online (Sandbox Code Playgroud)
在这种情况下,查询将生成如下:
Hibernate: insert into A (NAME, ID) values (?, ?)
Hibernate: update A set NAME=? where ID=?
Run Code Online (Sandbox Code Playgroud)
所以persist()方法可以生成插入和更新.
现在merge():
SessionFactory sef = cfg.buildSessionFactory();
Session session = sef.openSession();
Singer singer = new Singer();
singer.setName("Luciano Pavarotti");
session.merge(singer);
session.flush();
Run Code Online (Sandbox Code Playgroud)
这是我在数据库中看到的:
SINGER_ID SINGER_NAME
1 Ricky Martin
2 Madonna
3 Elvis Presley
4 Luciano Pavarotti
Run Code Online (Sandbox Code Playgroud)
现在使用更新记录 merge()
SessionFactory sef = …Run Code Online (Sandbox Code Playgroud) 应用程序部署后,当方法执行时,我得到以下错误.
Caused by: org.hibernate.service.jndi.JndiException: Unable to lookup JNDI name [java:comp/env/JSF_HIBER/ORACLE]
at org.hibernate.service.jndi.internal.JndiServiceImpl.locate(JndiServiceImpl.java:68)
at org.hibernate.service.jdbc.connections.internal.DatasourceConnectionProviderImpl.configure(DatasourceConnectionProviderImpl.java:116)
at org.hibernate.service.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:75)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:159)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:131)
at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.buildJdbcConnectionAccess(JdbcServicesImpl.java:223)
at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:89)
at org.hibernate.service.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:75)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:159)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:131)
at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:77)
at org.hibernate.cfg.Configuration.buildSettingsInternal(Configuration.java:2283)
at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2279)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1748)
at com.utils.HibernateUtils.<clinit>(HibernateUtils.java:19)
... 33 more
Caused by: javax.naming.NamingException: This context must be accessed through a java: URL
at org.apache.naming.SelectorContext.parseName(SelectorContext.java:776)
at org.apache.naming.SelectorContext.lookup(SelectorContext.java:135)
at javax.naming.InitialContext.lookup(Unknown Source)
at org.hibernate.service.jndi.internal.JndiServiceImpl.locate(JndiServiceImpl.java:65)
... 47 more
Run Code Online (Sandbox Code Playgroud)
的context.xml
<Resource name="JSF_HIBER/ORACLE" auth="Container"
type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000"
username="****" password="**** driverClassName="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@99.99.999.999:1521:xe" /> …Run Code Online (Sandbox Code Playgroud) 我想,我的java代码是正确的,但记录没有显示在dataTable上.
请检查以下代码.我不知道我犯了什么错误.
.xhtml
<p:dataTable value="#{userDetailList.userDataList}" var="user" rows="5"
paginator="true" lazy="true"
paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink}
{CurrentPageReport} {NextPageLink} {LastPageLink}">
<p:column headerText="No">
<h:outputText value="#{user.id}"></h:outputText>
</p:column>
<p:column headerText="User Name">
<h:outputText value="#{user.userName}"></h:outputText>
</p:column>
</p:dataTable>
Run Code Online (Sandbox Code Playgroud)
的.java
@PostConstruct
public void init(){
// +getter , setter
userDataList = new LazyDataModel<UserDetail>(){
private static final long serialVersionUID = 1L;
@Override
public List<UserDetail> load(int first, int pageSize, String sortField,
SortOrder sortOrder, Map<String, String> filters) {
return lazyDataModelCom.getResultList(first, pageSize, sortField, sortOrder, filters);
}
};
}
Run Code Online (Sandbox Code Playgroud)
getResultList
public List<UserDetail> getResultList(int first, int pageSize, String sortField, …Run Code Online (Sandbox Code Playgroud)