我有以下对象结构:
@Document(collection = "user")
@TypeAlias("user")
public class User {
@Id
private ObjectId id;
private Contact info = new Contact();
}
Run Code Online (Sandbox Code Playgroud)
这是联系人pojo:
public class Contact {
@Indexed(unique = true)
private String mail;
}
Run Code Online (Sandbox Code Playgroud)
但由于我不知道的一些原因,我没有看到Spring-data为属性info.mail创建一个唯一的索引
总而言之,我有这个用户对象的json结构: {_ id:xxxxx,info:{mail:"abc@xyz.shoes"}}
我想使用具有上述pojo结构的Spring数据在info.mail上创建一个唯一索引.请帮忙.
请考虑以下示例:
public final class ImmutableWrapper<T extends Number> {
private final T value;
public ImmutableWrapper(T value) {
// a subclass of Number may be mutable
// so, how to defensively copying the value?
this.value = value;
}
public T getValue() {
// the same here: how to return a copy?
return value;
}
}
Run Code Online (Sandbox Code Playgroud)
为了使这个类不可变,我必须防御性地复制传递给构造函数的任何可变参数,并创建由公共方法返回的内部可变对象的副本.
这可能吗?如果没有,是否有任何解决方法?
首先,让我解释一下我的用例.这很直接.有一个用户实体和一个服务实体.我使用UserService作为Joined实体(连接表)在User和Service之间有很多关联.最初,会有一些用户和一些服务集.用户可以随时订阅任何服务.在这种情况下,将向UserService添加一个条目.但是,当我试图创建一个新的UserService关联时,我得到空指针异常.我可以单独创建用户和服务.
我的实体是:User.java
package dao.models;
import java.io.Serializable;
import javax.persistence.*;
import com.fasterxml.jackson.annotation.JsonBackReference;
@Entity
@org.hibernate.annotations.Proxy(lazy=false)
@Table(name="`user`", schema="emm")
public class User implements Serializable {
public User() {
}
@Column(name="id", nullable=false, unique=true)
@Id
@GeneratedValue(generator="EMM_USER_ID_GENERATOR")
@org.hibernate.annotations.GenericGenerator(name="EMM_USER_ID_GENERATOR", strategy="native")
private long id;
@ManyToOne(targetEntity=dao.models.Tenant.class, fetch=FetchType.LAZY)
@org.hibernate.annotations.Cascade({org.hibernate.annotations.CascadeType.LOCK})
@JoinColumns({ @JoinColumn(name="tenant_id", referencedColumnName="id", nullable=false) })
@org.hibernate.annotations.LazyToOne(value=org.hibernate.annotations.LazyToOneOption.NO_PROXY)
private dao.models.Tenant tenant;
@OneToOne(targetEntity=dao.models.Person.class, fetch=FetchType.LAZY)
@org.hibernate.annotations.Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.LOCK})
@JoinColumns({ @JoinColumn(name="Person_id", nullable=false) })
@org.hibernate.annotations.LazyToOne(value=org.hibernate.annotations.LazyToOneOption.NO_PROXY)
private dao.models.Person person;
@Column(name="password", nullable=true, length=255)
private String password;
@Column(name="email", nullable=false, length=255)
private String email;
@Column(name="status", nullable=true, length=255)
private String status;
@ManyToMany(mappedBy="user", targetEntity=dao.models.TenantGroup.class)
@org.hibernate.annotations.Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.LOCK}) …Run Code Online (Sandbox Code Playgroud) 我正在使用JPA 2.1示例应用程序Hibernate 4.3.x实现.
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="unit1">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<class>net.roseindia.model.Product</class>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/common"/>
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
<property name="hibernate.connection.username" value="root"/>
<property name="hibernate.connection.password" value="root"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
</properties>
</persistence-unit>
</persistence>
Run Code Online (Sandbox Code Playgroud)
在pom.xml我有以下依赖.
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.3.5.Final</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
示例命令行应用程序正常工作(非常简单)但是在启动它时会收到以下警告消息.
Apr 13, 2014 1:12:43 PM org.hibernate.ejb.HibernatePersistence logDeprecation
WARN: HHH015016: Encountered a deprecated javax.persistence.spi.PersistenceProvider [org.hibernate.ejb.HibernatePersistence]; use [org.hibernate.jpa.HibernatePersistenceProvider] instead.
Run Code Online (Sandbox Code Playgroud)
那么,这是我的错误配置问题(我可以避免它吗?),或者它是Hibernate实现中的问题?
更新
这是我使用的代码:
import net.roseindia.model.Product;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory; …Run Code Online (Sandbox Code Playgroud) 我在我的项目中面临一些问题,这是一个Spring MVC项目.在这个项目中,对于持久层,我们使用的是Hibernate.
以下是我的web.xml详细信息:
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/beanRefFactory.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
Run Code Online (Sandbox Code Playgroud)
当我尝试运行此项目时,我收到以下错误:
java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1688)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1533)
at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:525)
at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:507)
at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:124)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4701)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5260)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1525)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1515)
at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
这是我的classpath jar详细信息:
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/hibernate/ant-1.6.5.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/hibernate/ant-antlr-1.6.5.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/hibernate/antlr-2.7.6.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/hibernate/aopalliance-1.0.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/hibernate/asm-attrs.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/hibernate/asm.jar"/>
<classpathentry …Run Code Online (Sandbox Code Playgroud) 我们正在开发一个小网站(将在Tomcat上运行),数据层使用JPA(Eclipselink)完成.我前段时间做过类似的事情.但我总是不确定何时需要开始和结束交易或进行同花.目前我使用事务,如果我添加(持久)和删除对象.如果我在已经持久化的对象上调用setter,则不使用事务.
是否有指南/教程或简短的答案何时使用事务或如何正确实现应用程序管理的JPA.
我在其中我实现的Spring Security我的Web应用程序spring-security.xml就是
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.0.xsd">
<!-- ENABLE HTTP SECURITY -->
<http auto-config="false" access-denied-page="/accessDenied.html">
<!-- INTERCEPT URL FOR RESOURCES ACCESS -->
<intercept-url pattern="/admin/" access="hasRole('ADMIN_ROLE')" />
<intercept-url pattern="/users/" access="hasRole('USER_ROLE')" />
<intercept-url pattern="/**" access="permitAll" />
<!-- CUSTOME FILTER -->
<custom-filter position="CONCURRENT_SESSION_FILTER" ref="concurrencyFilter" />
<custom-filter position="FORM_LOGIN_FILTER" ref="AuthFilter" />
<!-- SESSION MANAGEMENT CONFIG -->
<session-management
session-authentication-strategy-ref="session-management" />
<!-- FORM LOGIN CONFIG -->
<form-login login-page="/loginForm"
authentication-failure-url="/error.html" default-target-url="/welcome.html" />
<logout logout-success-url="/loggedout.html"
invalidate-session="true" />
</http>
<!-- SERVICES --> …Run Code Online (Sandbox Code Playgroud) 我正在尝试向REST端点发送一个简单的POST请求.我有一个简单的pojo,我想在有效载荷中发送为JSON.这是pojo(请注意我使用Spring与Grails集成,因此pojo/service在Groovy中):
class Person implements Serializable {
String name
}
Run Code Online (Sandbox Code Playgroud)
这是我的门户:
public interface PersonGateway {
Person savePerson(Person person)
}
Run Code Online (Sandbox Code Playgroud)
以下是布线的重要部分:
<int:channel id="requestChannel" />
<int:channel id="responseChannel" />
<int:header-enricher input-channel="requestChannel">
<int:header name="Content-Type" value="application/json" />
</int:header-enricher>
<int:gateway id="PersonGateway"
service-interface="com.example.PersonGateway"
default-request-channel="requestChannel"
default-reply-channel="responseChannel">
<int:method name="savePerson" />
</int:gateway>
<int-http:outbound-gateway url="http://127.0.0.1:8000/person"
http-method="POST"
message-converters="jsonConverter"
expected-response-type="com.example.Person"
request-channel="requestChannel"
extract-request-payload="false"/>
Run Code Online (Sandbox Code Playgroud)
此POST请求永远不会到达该服务,但不会抛出任何异常.当我记录所有级别时,我得到的唯一一个看起来像线索的是:
2014-03-30 16:35:07,313 [main] DEBUG outbound.HttpRequestExecutingMessageHandler - 无法尝试转换消息有效负载类型.组件'org.springframework.integration.http.outbound.HttpRequestExecutingMessageHandler#0'没有显式的ConversionService引用,并且上下文中没有'integrationConversionService'bean.
除此之外它不会给我太多.我一整天都在尝试一些小事情,似乎无处可去.有人看到我错过了吗?谢谢!
我有一个从数据库读取的作业步骤,并将输出写入平面文件并创建报告.
如果步骤失败,我希望它重新启动,从顶部处理全部.我不想将任何恢复纳入此步骤.
实现Spring Batch的最佳方法是什么,因此这个tasklet不会在进程中间执行任何块处理和触发恢复?
我在No operations allowed after statement closed.尝试将值插入数据库的 Java 代码中收到带有签名的异常。错误签名表示我的 Statement 对象已关闭,我正在尝试在我的代码中再次使用它,但我很难理解为什么会发生这种情况,因为我没有关闭代码中任何地方的任何连接。
这是Java代码。
public class DataBaseAccessUtils {
private static String jdbcUrl =
AppConfig.findMap("BXRequestTracker").get("jdbcUrl").toString();
private static Connection connection = null;
private static Statement statement = null;
public static void insertHostname(String hostname, String rid, String fleet, String locale)
{
locale.toUpperCase();
String sql = "UPDATE " + locale + "REQUESTTRACKER SET " + fleet
+ "='" + hostname + "' WHERE RID='" + rid + "'";
try {
statement.execute(sql);
}
catch (SQLException e) …Run Code Online (Sandbox Code Playgroud) java ×10
spring ×6
jpa ×2
spring-mvc ×2
generics ×1
hibernate ×1
jpa-2.0 ×1
jpa-2.1 ×1
mongodb ×1
mysql ×1
processing ×1
spring-batch ×1